При написании нескольких запросов мне нужно было вернуть только те строки, в которых столбец даты установлен в этом году (2017), это не моя проблема. Я знаю, как написать этот запрос несколькими разными способами, но я наткнулся на что-то странное и неожиданное для меня . Кто-нибудь может объяснить, почему Oracle db 11.2 ведет себя таким образом?
select sysdate from dual
returns:
2017/12/05 09:22:27
select to_date(2017,'YYYY'),trunc(sysdate,'YYYY') from dual
returns :
2017/12/01 00:00:00 2017/01/01 00:00:00
select to_date(2017,'YYYY'),trunc(sysdate,'YYYY') from dual
where trunc(sysdate,'YYYY') = to_date(2017,'YYYY')
no rows returned
Почему to_date(2017,'YYYY')
возвращает 2017/12/01
, вернет ли он 2017/01/01
в следующем месяце? Почему это работает именно так? Я бы ожидал, что он всегда будет возвращать 2017/01/01
независимо от текущего месяца (если часть месяца действительно меняется в зависимости от sysdate).
TO_DATE( '02', 'MM' )
, и он использовал текущий день месяца, то оператор выдал бы ошибку, поскольку в феврале нет 31 дня. Я никогда не видел обоснования того, почему используется текущий месяц (а не первый месяц), но я предполагаю, что существует значительный вариант использования для людей, которые хотят, чтобы даты были в текущем месяце определенного года, и это поведение по умолчанию допускает это . - person MT0   schedule 05.12.2017where extract(year from some_date) = extract(year from sysdate)
- person a_horse_with_no_name   schedule 05.12.2017