2010-08-10 5 views
12

È questo il modo migliore per determinare se una data Oracle è in un fine settimana?Determina se la data di Oracle è in un fine settimana?

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

In realtà la fine settimana non è Sabato/Domenica in tutti i paesi, una manciata (20-30) paesi hanno un fine settimana in giorni diversi (fonte: en.wikipedia.org/wiki/Workweek_and_weekend) –

risposta

22

A partire da Oracle 11g, sì. L'unica regione valida alternativa agnostica che ho visto è la seguente:

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

Perché il giorno giuliano funziona davvero? –

+1

@ Michael-O - perché le date di Julian sono fondamentalmente un conteggio di giorni da un momento fisso, noto in tempo, puoi usare la matematica di base per determinare se fosse o meno un fine settimana, perché sai già quale giorno del giorno della settimana 1 era. Poiché gli altri calendari hanno lunghezze di un mese, lunghezze annuali, giorni bisestili e anni bisestili, è più difficile ricavare informazioni sul giorno della settimana per altri calendari, data una singola data con cui lavorare. – ninesided

4

Non una risposta alla domanda. Ma qualche altra informazione. Ci sono molti altri trucchi SQL con la data.

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 

Ulteriori informazioni: to_char funzione.

+7

nessuno di questi risolve il problema, il primo è pericoloso poiché "giorno della settimana" dipende dalla regione, ad esempio: 1 = domenica negli Stati Uniti, lunedì nel Regno Unito. – ninesided

+0

Vero e accettato. E io pretendo di rispondere alla domanda, ho appena aggiunto più informazioni. La tua risposta ha risolto il problema. – Guru

1

set NLS_TERRITORY prima

alter session set NLS_TERRITORY=SWEDEN; 

Così si è sicuri che i numeri sono il fine settimana

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

non è corretto! Il numero del giorno del fine settimana potrebbe essere 6 & 7, o 7 e 1, a seconda delle impostazioni NLS.

Così il test vero e proprio (a prescindere dal NLS-settings) è questo uno accennato prima:

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

Penso che potresti non essere corretto qui, il formato 'J' rappresenta la data giuliana, il numero di giorni trascorsi da un punto fisso nel tempo ed è completamente indipendente dalle impostazioni NLS. Vedi questo articolo per riferimento: http://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number – ninesided

1

A mio parere la migliore opzione è

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

+0

Se sei d'accordo con qualcun altro, dovresti inversiarli, non aggiungere codice duplicato. –