I think that your solution is also a generic one. But i thought that since saturday and sunday are not business days, the query will not be played.
On monday 08h00, we know that there is no new records in the table. I encourage Crisiti to study this solution also. Mathias Selon Michael Stassen <[EMAIL PROTECTED]>: > inferno wrote: > > Hi, > > > > I have a problem: I need to make a select for data that was entered > > more than 24 hours ago, but in that 24 hours I have to count only Monday > > - Friday since that is the working program, and does not have the status > > = '2' ( Solved ) and the problem is that I sincerly do not know how. > > Any help/suggestions are apreciated since I am just a beginner. > > > > Best regards, > > Cristi Stoica > > > > P.S.: to give you a little idea on what I am using: > > ( the interface is coded in PHP for the users ) > > MySQL 4.0.24 and the the data looks like this: > > > > > +-------------+------------------+------+-----+---------------------+----------------+ > > > | Field | Type | Null | Key | Default | > Extra | > > > +-------------+------------------+------+-----+---------------------+----------------+ > > > | id | int(25) unsigned | | PRI | NULL | > auto_increment | > > | client_name | varchar(100) | | | | > | > > | code | bigint(13) | | | 0 | > | > > | status | varchar(13) | | | 0 | > | > > | date | datetime | | | 0000-00-00 00:00:00 | > | > > > +-------------+------------------+------+-----+---------------------+----------------+ > > > > [EMAIL PROTECTED] wrote: > > Hi Cristi, > > Look at this : > > > > mysql> select now(); > > +---------------------+ > > | now() | > > +---------------------+ > > | 2005-09-02 23:15:21 | > > +---------------------+ > > 1 row in set (0.00 sec) > > > > mysql> select DATE_ADD(now(), INTERVAL -1 DAY); > > +----------------------------------+ > > | DATE_ADD(now(), INTERVAL -1 DAY) | > > +----------------------------------+ > > | 2005-09-01 23:15:27 | > > +----------------------------------+ > > 1 row in set (0.00 sec) > > > > mysql> select date_format(now(),'%a'); > > +-------------------------+ > > | date_format(now(),'%a') | > > +-------------------------+ > > | Fri | > > +-------------------------+ > > 1 row in set (0.01 sec) > > > > > > So your query should be similar to : > > > > Select * from tbl where status='2' and date <= DATE_ADD(now(), > > INTERVAL -1 DAY) > > and date_format(date, '%a') in ('Mon', 'Tue', ...,'Fri'); > > > > > > Hope that helps > > Mathias > > > > inferno wrote: > > Hi, > > > > It is perfect, I was thinking of doing it in php but the solution > > that I've had was no way optimal. > > Thank you very much for the help. > > > > Best regards and have a nice week-end, > > Cristi Stoica > > Are you sure? I don't think that query does what you describe. Mathias' > query shows rows entered over 24 clock hours ago, but leaves out weekend > rows. I thought you wanted rows over 24 business hours old. That is, if > you run this query at 09:30 on a Monday, 24 hours ago means 09:30 last > Friday. Is that correct? In other words, a row entered at 16:30 on Friday > is not yet 24 business hours old at 09:30 on Monday, because weekends don't > count. Such an entry would be returned by Mathias' query. > > If I'm right, you need a different query. The key is that "yesterday" is 1 > day ago if today is Tuesday through Friday, but it is 3 days ago if today is > Monday. Hence, you need something like > > SET @daysago = IF(DAYNAME(CURDATE()) = 'Monday', 3, 1); > SET @yesterday = NOW() - INTERVAL @daysago DAY; > > SELECT * FROM yourtable > WHERE date <= @yesterday > AND status = '2'; > > You can do it in one query without user variables, if you like, but it's a > little uglier: > > SELECT * FROM yourtable > WHERE date <= NOW() - INTERVAL IF(DAYNAME(CURDATE()) = 'Monday', 3, 1) DAY > AND status = '2'; > > I've assumed the query will only be run on a business day. If you need to > be able to run this on the weekend and get correct results, it becomes a bit > more complicated. Something like: > > SET @yesterday = CASE DAYNAME(CURDATE()) > WHEN 'Saturday' THEN CURDATE() - INTERVAL 1 DAY > WHEN 'Sunday' THEN CURDATE() - INTERVAL 2 DAY > > WHEN 'Monday' THEN NOW() - INTERVAL 3 DAY > > ELSE NOW() - INTERVAL 1 DAY > > END; > > SELECT * FROM yourtable > WHERE date <= @yesterday > AND status = '2'; > > Again, you can do it in one query by replacing @yesterday in the SELECT with > the CASE statement on the right side of the SET statement, but it's ugly. > > For more information, see the manual: > > Date and time functions > <http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html> > > User variables > <http://dev.mysql.com/doc/mysql/en/variables.html> > > IF and CASE functions > <http://dev.mysql.com/doc/mysql/en/control-flow-functions.html> > > Michael > > -- > MySQL General Mailing List > For list archives: http://lists.mysql.com/mysql > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED] > > -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]