Pergunta

Essa é a melhor maneira de determinar se uma data do Oracle está em um fim de semana?

select * from mytable
where 
TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN');
Foi útil?

Solução

A partir do Oracle 11g, sim. A única alternativa agnóstica de região viável que eu já vi é a seguinte:

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

Outras dicas

Não é uma resposta para a pergunta. Mas mais algumas informações. Existem muitos mais truques SQL com a 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

Mais aqui: to_char função.

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

não está correto! O número do dia de dias de fim de semana pode ser 6 e 7, ou 7 e 1, dependendo das definições do NLS.

Portanto, o teste adequado (independentemente das definições de NLS) é mencionado antes:

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

Na minha opinião, a melhor opção é

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

defina nls_territory antes

alter session set NLS_TERRITORY=SWEDEN;

Então você tem certeza de quais números são fins de semana

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top