2009-08-20 9 views
1

Hier ist meine Frage:Wie formuliere ich eine SQL-Abfrage mit DATE_SUB, um nach Daten von gestern zu suchen ODER, wenn es Montag ist, um nach Daten von Freitag zu suchen?

SELECT * 
FROM daily_records 
AND date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) 

ich diese verwenden, um einen Bericht über alles zu erzeugen, die gestern passiert ist. Das funktioniert super, Dienstag-Freitag. Ich möchte aber am Montag, dass ich bis Freitag (der vorherige Arbeitstag, zB INTERVAL 3 DAY) zurück suchen kann.

Gibt es eine Möglichkeit, dies in mySQL zu tun? Oder muss ich nur den Wochentag in PHP überprüfen, bevor ich die Abfrage schreibe?

Antwort

3

Dies sollte es tun:

SELECT * FROM daily_records AND date = 
DATE_SUB(CURDATE(), INTERVAL IF(DATE_FORMAT(NOW(), '%w') = 1, 3, 1) DAY) 
+0

Ich mag das ... Ich denke, ich muss die 5 in der if-Anweisung ändern, so lautet es: IF (DATE_FORMAT ('% w', NOW()) = 1, 3, 1) weil NOW() würde sei Montag, nicht Freitag. Vielen Dank! – Jen

+0

Eine andere Anmerkung - ich habe gerade DAYOFWEEK() und DATE_FORMAT() recherchiert und sie verwenden unterschiedliche Indizes. Mit DAYOFWEEK(), Sonntag = 1. Mit DATE_FORMAT(), Sonntag = 0. Wer weiß warum?!? – Jen

+0

Das stimmt ... DAYOFWEEK folgt ODBC, DATE_FORMAT folgt ... ISO? – Greg

3

Sie tun könnte ...

SELECT * 
FROM daily_records 
WHERE date = IF(DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), DATE_SUB(CURDATE(), INTERVAL 1 DAY)) 
+0

Same-Sekunden-Antworten! – Greg

0
mysql> create function PREV_BIZ_DATE() 
    -> returns DATE 
    -> return (CURRENT_DATE() - interval if(DAYOFWEEK(CURRENT_DATE()) = 2, 3, 1) day); 

mysql> SELECT * FROM daily_records WHERE date = PREV_BIZ_DATE(); 
Verwandte Themen