Hi,
Yes I want only 24 hours of business program, and like you've said I
do not want to include Saturday and Sunday, since nobody is working in
the week-end.
Thank you very much for the help.
Best regards and have a nice week-end,
Cristi Stoica
Michael Stassen wrote:
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]