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]

Reply via email to