powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / странное поведение oracle sql developer, сравнение дат
20 сообщений из 20, страница 1 из 1
странное поведение oracle sql developer, сравнение дат
    #39346992
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите разобраться, в чем проблема. Вот этот запрос
Код: plsql
1.
2.
3.
select alert_date
FROM alert a
WHERE a.alert_date > to_timestamp('10/01/1920', 'mm/dd/yyyy')


возвращает данные нормально, а этот
Код: plsql
1.
2.
3.
select alert_date
FROM alert a
WHERE a.alert_date > nvl(:start_date, to_timestamp('10/01/1920', 'mm/dd/yyyy'))


при подстановке null не возвращает ничего. Причем экспериментально выяснил, что второй запрос 1920 преобразует к 2020, из-за чего данных и нет. NLS_DATE/TIMESTAMP_FORMAT базы dd-mon-rr. Если выставить nls форматы в mm/dd/yyyy в сессии, все чудесным образом начинает работать правильно. Это какая-то фишка sql developer'а или я что-то не так делаю?
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347027
daunito,

Неявные преобразования типов ...
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347043
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito..
при подстановке null не возвращает ничего. Причем экспериментально выяснил, что второй запрос 1920 преобразует к 2020, из-за чего данных и нет. NLS_DATE/TIMESTAMP_FORMAT базы dd-mon-rr. Если выставить nls форматы в mm/dd/yyyy в сессии, все чудесным образом начинает работать правильно. Это какая-то фишка sql developer'а или я что-то не так делаю?
если ваши данные застряли в прошлом веке, то любой формат даты с двузначным годом вам не подойдёт
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347062
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так где неявные преобразования где? Я же явно задаю формат строки, которая должна преобразоваться в timestamp. А дальше сравниваются два timestamp. to_timestamp неправильно преобразует или сравнение двух дат требует еще каких-то приведений?
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347063
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunitoтак где неявные преобразования где?Первый аргумент nvl какого типа?
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347110
Michael Isaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito,

Код: plsql
1.
2.
with alert as (select (sysdate + level - 3) alert_date from dual connect by level < 10)
select alert_date from alert where alert_date > nvl(sysdate, to_timestamp('10/01/1920', 'mm/dd/yyyy')) 



отрабатывает нормально.

Ищи ошибку у себя в таблице, руках, голове.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347750
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Первый аргумент nvl какого типа?
я туда null подставляю. В принципе аргумент можно заменить на null и все будет так же не работать.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347755
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Isaevdaunito,

Код: plsql
1.
2.
with alert as (select (sysdate + level - 3) alert_date from dual connect by level < 10)
select alert_date from alert where alert_date > nvl(sysdate, to_timestamp('10/01/1920', 'mm/dd/yyyy')) 



отрабатывает нормально.

Ищи ошибку у себя в таблице, руках, голове.
Спасибо, кэп! select sysdate from dual, кстати тоже неплохо работает. Часто ли sysdate возвращает null? Даты из того же 21 века. К чему пример-то был?
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347917
Michael Isaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunitoMichael Isaevdaunito,

Код: plsql
1.
2.
with alert as (select (sysdate + level - 3) alert_date from dual connect by level < 10)
select alert_date from alert where alert_date > nvl(sysdate, to_timestamp('10/01/1920', 'mm/dd/yyyy')) 



отрабатывает нормально.

Ищи ошибку у себя в таблице, руках, голове.
Спасибо, кэп! select sysdate from dual, кстати тоже неплохо работает. Часто ли sysdate возвращает null? Даты из того же 21 века. К чему пример-то был?
Капитан неочевидность, ты все таки к рукам то присмотрись, и почитай внимательно, что тебя спрашивали и что тебе советовали
Код: plsql
1.
2.
3.
with d as (select to_timestamp(null) as start_date from dual)
,alert as (select to_timestamp('1920100'||level||'', 'yyyymmdd') as alert_date from dual connect by level < 10)
select alert_date from alert, d where alert_date > nvl(d.start_date, to_timestamp('10/03/1920', 'mm/dd/yyyy')) 
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39347927
Michael Isaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with alert as (select to_timestamp('1920100'||level||'', 'yyyymmdd') alert_date from dual connect by level < 10)
select alert_date from alert where alert_date > nvl(to_timestamp(:start_date, 'mm/dd/yyyy'), to_timestamp('10/03/1920', 'mm/dd/yyyy')) 

with alert as (select to_date('1920100'||level||'', 'yyyymmdd') alert_date from dual connect by level < 10)
select alert_date from alert where alert_date > nvl(to_timestamp(:start_date, 'mm/dd/yyyy'), to_timestamp('10/03/1920', 'mm/dd/yyyy')) 

with alert as (select to_timestamp('1920100'||level||'', 'yyyymmdd') alert_date from dual connect by level < 10)
select alert_date from alert where alert_date > nvl(to_date(:start_date, 'mm/dd/yyyy'), to_timestamp('10/03/1920', 'mm/dd/yyyy')) 



Усё работает в Oracle SQL Developer-е
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350052
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Первый аргумент nvl какого типа?
в случае если первый элемент - параметр или null, что к чему будет приводится?
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350072
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito-2-Первый аргумент nvl какого типа?в случае если первый элемент - параметр или null, что к чему будет приводится?При чём тут мы? Задай этот вопрос сперва себе, даунище. А потом, если у тебя конечно же есть проплаченное потным долларам право, у разработчика того (недо)гуя.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350079
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunitoв случае если первый элемент - параметр или null, что к чему будет приводится?

Доку не курим всвязи c всеобщей борьбы с курением?

NVL

The arguments expr1 and expr2 can have any data type. If their data types are different, then Oracle Database implicitly converts one to the other. If they cannot be converted implicitly, then the database returns an error. The implicit conversion is implemented as follows:

If expr1 is character data, then Oracle Database converts expr2 to the data type of expr1 before comparing them and returns VARCHAR2 in the character set of expr1.

Код: plsql
1.
WHERE a.alert_date > nvl(:start_date, to_timestamp('10/01/1920', 'mm/dd/yyyy'))



Байнд переменная у тебя конечно VARCHAR2/CHAR. В результате NVL неявно преобразуeт to_timestamp('10/01/1920', 'mm/dd/yyyy') обратно в строку согласно формату по умолчанию который как пить дать имеет только две последние цифры года, т.е. 20. Затем при сравнении с a.alert_date строка с годом 20 преобразуется в DATE/TIMESTAMP и voila - год 2020.

SY.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350196
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicПри чём тут мы? Задай этот вопрос сперва себе, даунище. А потом, если у тебя конечно же есть проплаченное потным долларам право, у разработчика того (недо)гуя.
Уж ты тут точно ни при чем. Ни разу ничего полезного от тебя не слышал.

2 SY, Доку в первую очередь перечитал. Там про нумерики и строковые типы. Про даты и null ничего не сказано. Если убрать bind переменную и просто подставить null, то точно так же не работает. Как в этом случае будут приводится типы нигде инфы не нашел. По здравому смыслу, если первый параметр явно null, то должен вернуться второй, который to_timestamp. И все выражение как бы должно быть timestamp, который потом сравнивается с timestamp. Но так не происходит. Поэтому решил уточнить у товарищей где подвох. И, сцуко, конечно же сразу тонны говна полились, как в анекдоте про американский, еврейский и русский форум.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350234
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunitoПоэтому решил уточнить у товарищей где подвох. И, сцуко, конечно же сразу тонны говна полились, как в анекдоте про американский, еврейский и русский форум.Дебилито, RTFM NVL (FAQ) : "If expr1 is character data, then Oracle Database converts expr2 to ..."
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350293
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito2 SY, Доку в первую очередь перечитал. Там про нумерики и строковые типы.

Ну так " Байнд переменная у тебя конечно VARCHAR2/CHAR "

SY.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350304
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну-ну
Не надо кричать
С биндами понятно
А вот с константой...

Действительно трудно объяснить, что литерал NULL в данном случае (nvl(null, systimestamp)) по умолчанию является CAST(NULL as VARCHAR) и второй аргумент будет приводится именно к VARCHAR

И ведь где-то в доке(?) я про такое умолчание видел, но вот сходу не нашел
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350331
create view
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровИ ведь где-то в доке(?)Это нуллство ведь и dumpом не проверить на тип.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39350349
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНе надо кричать


Вячеслав,

Я ведь пытaлся. Вроде разжевал - дальшe некуда и все равно не дошло. Видать плохой я учитель .

Вячеслав ЛюбомудровДействительно трудно объяснить, что литерал NULL в данном случае (nvl(null, systimestamp)) по умолчанию является CAST(NULL as VARCHAR) и второй аргумент будет приводится именно к VARCHAR


Ты путаешь ситуацию когда NULL нет с чем сравнить с ситуацeй когда есть. Когда нет (например при создании представления с полем литерал NULL или сравниваются два литералa NULL или в качестве выражения на базе которого определяется тип данных результата указан литерал NULL), то Oracle использует VARCHAR2. А в остальных случаях литерал NULL типа не имеет и посему неявно преобразуется к типу другого операнда. Так-что с литералом NULL проблемы 1920/2020 нет:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
SQL> select  value
  2    from  nls_session_parameters
  3    where parameter = 'NLS_TIMESTAMP_FORMAT'
  4  /

VALUE
----------------------------------------------------------------
DD-MON-RR HH.MI.SSXFF AM

SQL> select  1
  2    from  dual
  3    where systimestamp > nvl(null,to_timestamp('10/01/1920','mm/dd/yyyy'))
  4  /

         1
----------
         1

SQL> variable start_date varchar2(20)
SQL> select  1
  2    from  dual
  3    where systimestamp > nvl(:start_date,to_timestamp('10/01/1920','mm/dd/yyyy'))
  4  /

no rows selected

SQL> alter session set nls_timestamp_format='DD-MON-YY HH.MI.SSXFF AM'
  2  /

Session altered.

SQL> select  1
  2    from  dual
  3    where systimestamp > nvl(null,to_timestamp('10/01/1920','mm/dd/yyyy'))
  4  /

         1
----------
         1

SQL> select  1
  2    from  dual
  3    where systimestamp > nvl(:start_date,to_timestamp('10/01/1920','mm/dd/yyyy'))
  4  /

no rows selected

SQL> alter session set nls_timestamp_format='DD-MON-YYYY HH.MI.SSXFF AM'
  2  /

Session altered.

SQL> select  1
  2    from  dual
  3    where systimestamp > nvl(null,to_timestamp('10/01/1920','mm/dd/yyyy'))
  4  /

         1
----------
         1

SQL> select  1
  2    from  dual
  3    where systimestamp > nvl(:start_date,to_timestamp('10/01/1920','mm/dd/yyyy'))
  4  /

         1
----------
         1

SQL> 



SY.
...
Рейтинг: 0 / 0
странное поведение oracle sql developer, сравнение дат
    #39351044
Теща кэпа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to_date(null) никто не отменял
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / странное поведение oracle sql developer, сравнение дат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]