2010-11-30 25 views
7

Ich habe eine Tabelle, die unter anderem eine Datum Spalte servdate hat.Format Datum als Wochentag

Ich verwende die folgende Abfrage mir alle Aufträge innerhalb der letzten Woche zu erhalten (in der Woche von Montag beginnt):

SELECT * FROM tb1 WHERE servdate BETWEEN date('now', 'Weekday 1', '-21 days') AND date('now') 

Ich möchte die Abfrage genau die gleiche Arbeit, sondern die servdate Felder zurückkehren als ihr entsprechender Wochentag. Zum Beispiel "Montag" statt "2010-11-28".

Ist das möglich?

+1

wlalks Idee ist nett, aber der Einfachheit halber würde ich "Sonne" "mon" anstelle von "0" "1" bevorzugen – brux

Antwort

18

Sie können eine Zusatztabelle verwenden, wie wlalk vorgeschlagen; oder Sie können einen case Ausdruck verwenden:

select _id, busnum, 
    case cast (strftime('%w', servdate) as integer) 
    when 0 then 'Sunday' 
    when 1 then 'Monday' 
    when 2 then 'Tuesday' 
    when 3 then 'Wednesday' 
    when 4 then 'Thursday' 
    when 5 then 'Friday' 
    else 'Saturday' end as servdayofweek 
from tb1 
where ... 
+0

Schöner Nachtrag. Ich konnte nicht feststellen, dass 'case' in der Dokumentation unterstützt wird, aber ich habe es in Firefox versucht und es funktioniert gut:' SELECT visit_date, case cast (strftime ('% w', visit_date/1000000) als Ganzzahl) wenn 0 dann 'Sonne' wenn 1 dann 'mon' wenn 2 dann 'tue' wenn 3 dann 'wed' wenn 4 dann 'thu' wenn 5 dann 'fri' wenn 6 dann 'sat' sonst '???' Ende als visitdayofweek VON moz_historyvisits LIMIT 50' – wallyk

+0

thanks funktioniert – brux

+1

Der Fall Ausdruck ist dokumentiert unter http://www.sqlite.org/lang_expr.html –

-1
SELECT _id, busnum, date_format(servdate, '%a') as servdayofweek 
FROM tb1 
WHERE servdate BETWEEN date('now', 'Weekday 1', '-21 days') AND date('now') 

Der% a ist der abgekürzte Tag der Woche. Weitere Möglichkeiten zum Formatieren finden Sie unter documentation.


edit:

Hoppla! Übersieht das SQLite-Tag. Das obige ist für MySQL. Für SQLite (documentation):

SELECT _id, busnum, strftime('%w', servdate) as servdayofweek 
FROM tb1 
WHERE servdate BETWEEN date('now', 'Weekday 1', '-21 days') AND date('now') 

außer diesem gibt den Tag der Woche als Wert 0 bis 6 Vielleicht gut genug, das ist?

+1

Hallo, ich lief die Abfrage und bekam: SQL-Fehler: keine solche Funktion : date_format – brux

+0

könnte dieser code angepasst werden, um "mon" anstatt "1" usw. zurückzugeben? : D – brux

+0

Bisher habe ich keinen direkten Weg gefunden. Wenn Sie eine weitere Tabelle hinzufügen können, ist es trivial. – wallyk

0

Hier einen Vorschlag beteiligt weniger tippen als der CASE ... WHEN Block. Hier erfolgt das gleiche durch Substring-Extraktion:

select substr('SunMonTueWedThuFriSat', 1 + 3*strftime('%w', timestr), 3) as dow 
from ... 

Es produziert jedoch nur feste Länge Abkürzungen anstelle der vollen Wochentagsnamen, obwohl. (Aber manchmal ist das genug.)