no calendário, vejo que 30 e 31 de dezembro nos anos de 2025 e 2026 caem na mesma semana, mas usando a função to_char para criar o campo ano-semana, obterei semanas diferentes
select
to_char(to_date('30-12-2025','dd-mm-yyyy'),'yyyy-ww')
, to_char(to_date('31-12-2025','dd-mm-yyyy'),'yyyy-ww')
, to_char(to_date('30-12-2026','dd-mm-yyyy'),'yyyy-ww')
, to_char(to_date('31-12-2026','dd-mm-yyyy'),'yyyy-ww')
from dual;
Temos pedidos no banco de dados com data de término 30-12-2025 e, às vezes, 31-12-2025. O problema pode ser que em outra tabela existam outros dados com base na semana, como 2025-01 a 2025-53. Se eu quiser juntá-los, pode acontecer que o pedido que termina em 30-12-2025 não seja unido ao de 2025-53, mas, na verdade, a data é a semana 53.
Por que o comportamento no Oracle é esse?
Não posso usar a semana ISO porque para o ano de 2026 e 31 de dezembro será 2026-53, como esperado, mas não para 31 de dezembro de 2025, porque será 2025-01, o que é incorreto.
Verifiquei o NLS nas configurações e tentei o idioma da data alemão, inglês, formato dd-mm-rr ou dd-mm-aaaa. continua o mesmo
O principal problema é definir o início da semana — alguns preferem que seja domingo, outros que seja segunda-feira — ou pode ser o primeiro dia do ano.
É exatamente isso que causa problemas com a função To_Char():
1. Parâmetro WW - O primeiro dia da semana é o dia que cai no primeiro dia do ano - então pode ser qualquer dia (domingo, seg, ter,... qualquer) e isso define o dia de frenagem para todo o ano
2. Parâmetro IW - O primeiro dia da semana é sempre segunda-feira, MAS - se o ano terminar com menos da metade da semana (começando na segunda-feira) naquele ano específico, a semana será 01 (a maior parte dela será no ano novo) até a primeira segunda-feira do ano seguinte, quando se tornará 02. Se mais da metade da semana estiver no ano que termina, a semana será 53 até a próxima segunda-feira, quando será 01.
Veja o violino