2010-08-10 131 views
12

¿Es esta la mejor manera de determinar si una fecha de Oracle es en un fin de semana?Determine si la fecha de Oracle es en un fin de semana?

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

En realidad, el fin de semana no es el sábado/Domingo en todos los países, un puñado (20-30) países tienen fin de semana en diferentes días (fuente: en.wikipedia.org/wiki/Workweek_and_weekend) –

Respuesta

22

A partir de Oracle 11g, sí. La única alternativa viable agnóstico región que he visto es el siguiente:

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

¿Por qué el día juliano realmente funciona? –

+1

@ Michael-O - porque las fechas julianas son básicamente un recuento de días desde un punto fijo y conocido en el tiempo que puede usar las matemáticas básicas para determinar si fue o no un fin de semana, porque ya sabe qué día de la semana 1 fue Dado que otros calendarios tienen distintas longitudes de mes, largos de año, días bisiestos y años bisiestos, es más difícil obtener información sobre el día de la semana para otros calendarios, dada una fecha única para trabajar. – ninesided

4

No una respuesta a la pregunta. Pero algo más de información. Hay muchos más trucos de SQL con la fecha.

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 

Más información aquí: to_char function.

+7

ninguno de estos resuelve el problema, el primero es peligroso ya que "día de la semana" depende de la región, por ejemplo: 1 = domingo en los EE. UU., Lunes en el Reino Unido. – ninesided

+0

Verdadero y aceptado. Y no reclamo responder la pregunta, solo agregué más información. Tu respuesta resolvió el problema. – Guru

1

conjunto NLS_TERRITORY antes

alter session set NLS_TERRITORY=SWEDEN; 

Así que usted está seguro de qué números son los fines de semana

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

NO es correcta! El número de días de fin de semana puede ser 6 & 7, o 7 y 1, dependiendo de la configuración NLS.

Así que el criterio adecuado (con independencia de NLS-settings) es éste mencionó antes:

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

Creo que puede ser incorrecto aquí, el formato 'J' representa la fecha juliana, el número de días desde un punto fijo en el tiempo, y es completamente independiente de la configuración de NLS. Consulte este artículo para referencia: http://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number – ninesided

1

En mi opinión, la mejor opción es

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

+0

Si está de acuerdo con alguien más, debe revocarlos, no agregar código duplicado. –

Cuestiones relacionadas