несмотря на использование функции to_date
На самом деле это из-за с использованием функции to_date()
. У вас есть такие вещи:
TO_DATE(SYSDATE,'DD-MM-YYYY')
TO_DATE(s2.end_time,'DD-MM-YYYY')
TO_DATE(next_day(SYSDATE,'SATURDAY'),'DD-MM-YYYY')
TO_DATE(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND),'DD-MM-YYYY')
Второй из этих может быть в порядке, но только если sd.end_time
хранится в виде строки - что почти наверняка не должно быть.
Для остальных трех, по крайней мере, вы передаете что-то , которое уже является датой , в функцию, предназначенную для преобразования строки в дату. Итак, вы действительно делаете, например:
TO_DATE(TO_CHAR(SYSDATE),'DD-MM-YYYY')
и поскольку у этого неявного TO_CHAR()
нет модели формата, он будет использовать настройки NLS вашего сеанса, в частности NLS_DATE_FORMAT
. Вы видите, что это работает в одной среде, потому что настройки там фактически означают, что он делает:
TO_DATE(TO_CHAR(SYSDATE, 'DD-MM-YYYY'),'DD-MM-YYYY')
тогда как в другом сеансе это может быть эффективно:
TO_DATE(TO_CHAR(SYSDATE, 'DD-MON-RR'),'DD-MM-YYYY')
... что потеряло бы столетие, оставив значение даты в году 0019 вместо 2019 года; или
TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),'DD-MM-YYYY')
который выдает "ORA-01861: литерал не соответствует строке формата", как вы видите.
Хотя вы можете попытаться заставить настройки NLS на каждом клиенте и приложении соответствовать тому, что вы делаете, в конечном итоге вы ошибетесь, и вы должны делать это преобразование вообще. Просто используйте SYSDATE
и другие, рассчитанные напрямую; или если вы пытаетесь получить даты с установленным на полночь временем, обрежьте их:
trunc(SYSDATE)
trunc(s2.end_time)
trunc(next_day(SYSDATE,'SATURDAY'))
trunc(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND))
Также обратите внимание, что вторым аргументом next_day()
является название дня или сокращение на языке даты текущего сеанса, поэтому тот, кто запускает это из сеанса на другом языке, также увидит ошибки (например, «ORA-01846: не действительный день недели ").