2010-08-10 12 views
12

Ist dies der beste Weg festzustellen, ob ein Oracle-Datum an einem Wochenende ist?Ermitteln, ob Oracle-Datum an einem Wochenende ist?

select * from mytable 
where 
TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN'); 
+1

Eigentlich ist das Wochenende ist nicht Samstag/Sonntag in allen Ländern haben eine Handvoll (20-30) Länder an verschiedenen Tagen ein Wochenende (Quelle: en.wikipedia.org/wiki/Workweek_and_weekend) –

Antwort

22

Ab Oracle 11g ja. Die einzig gangbare Region Agnostiker Alternative, die ich gesehen habe, ist wie folgt:

SELECT * 
FROM mytable 
WHERE MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7); 
+0

Warum funktioniert der Julianische Tag eigentlich? –

+1

@ Michael-O - weil Julianische Daten im Grunde eine Zählung von Tagen seit einem festen, bekannten Zeitpunkt sind, können Sie Grundrechenarten verwenden, um zu bestimmen, ob es ein Wochenende war oder nicht, weil Sie bereits wissen, welcher Tag des Wochentages 1 war. Da andere Kalender unterschiedliche Monatslängen, Jahreslängen, Schalttage und Schaltjahre haben, ist es schwieriger, Informationen über den Wochentag für andere Kalender abzuleiten, wenn nur ein einziges Datum zur Verfügung steht. – ninesided

4

keine Antwort auf die Frage. Aber noch mehr Informationen. Es gibt viel mehr SQL-Tricks mit Datum.

to_char(sysdate, 'd') --- day of a week, 1,2,3 .. to 7 
to_char(sysdate, 'dd') --- day of a month, 1,2,3 .. to 30 or 31 
to_char(sysdate, 'ddd') --- day of a year, 1,2,3 .. to 365 or 366 
to_char(sysdate, 'w') --- week of a month, 1,2,3,4 or 5 
to_char(sysdate, 'ww') --- week of a year, 1,2,3 .. to 52 

Mehr hier: to_char Funktion.

+7

Keines davon löst das Problem, das erste ist gefährlich, da "Wochentag" regionabhängig ist, zum Beispiel: 1 = Sonntag in den USA, Montag im Vereinigten Königreich. – ninesided

+0

Wahr und akzeptiert. Und ich behaupte, die Frage zu beantworten, fügte einfach weitere Informationen hinzu. Ihre Antwort hat das Problem gelöst. – Guru

1

Satz NLS_TERRITORY vor

alter session set NLS_TERRITORY=SWEDEN; 

So sind Sie sicher, welche Zahlen sind Wochenenden

2
MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7) 

ist nicht korrekt! Die Anzahl der Tage am Wochenende kann 6 & 7 oder 7 und 1 sein, abhängig von den NLS-Einstellungen.

So ist der Proper-Test (unabhängig von NLS-Einstellungen) ist dies eine schon erwähnt:

TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') 
+1

Ich denke, dass Sie hier inkorrekt sein können, das 'J' Format stellt Julian Datum, die Anzahl der Tage seit einem festen Zeitpunkt, und ist völlig unabhängig von NLS-Einstellungen. Siehe diesen Artikel als Referenz: http://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number – ninesided

1

Meiner Meinung nach die beste Option

ist

TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN')

+0

Wenn Sie mit jemand anderem einverstanden sind, sollten Sie sie upvoten, keinen doppelten Code hinzufügen. –