Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / странное поведение oracle sql developer, сравнение дат / 20 сообщений из 20, страница 1 из 1
14.11.2016, 16:38
    #39346992
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
помогите разобраться, в чем проблема. Вот этот запрос
Код: 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
14.11.2016, 17:33
    #39347027
странное поведение oracle sql developer, сравнение дат
daunito,

Неявные преобразования типов ...
...
Рейтинг: 0 / 0
14.11.2016, 17:53
    #39347043
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
daunito..
при подстановке null не возвращает ничего. Причем экспериментально выяснил, что второй запрос 1920 преобразует к 2020, из-за чего данных и нет. NLS_DATE/TIMESTAMP_FORMAT базы dd-mon-rr. Если выставить nls форматы в mm/dd/yyyy в сессии, все чудесным образом начинает работать правильно. Это какая-то фишка sql developer'а или я что-то не так делаю?
если ваши данные застряли в прошлом веке, то любой формат даты с двузначным годом вам не подойдёт
...
Рейтинг: 0 / 0
14.11.2016, 18:18
    #39347062
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
так где неявные преобразования где? Я же явно задаю формат строки, которая должна преобразоваться в timestamp. А дальше сравниваются два timestamp. to_timestamp неправильно преобразует или сравнение двух дат требует еще каких-то приведений?
...
Рейтинг: 0 / 0
14.11.2016, 18:22
    #39347063
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
daunitoтак где неявные преобразования где?Первый аргумент nvl какого типа?
...
Рейтинг: 0 / 0
14.11.2016, 20:47
    #39347110
Michael Isaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
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
15.11.2016, 16:56
    #39347750
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
-2-Первый аргумент nvl какого типа?
я туда null подставляю. В принципе аргумент можно заменить на null и все будет так же не работать.
...
Рейтинг: 0 / 0
15.11.2016, 16:58
    #39347755
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
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
15.11.2016, 21:15
    #39347917
Michael Isaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
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
15.11.2016, 21:44
    #39347927
Michael Isaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
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
18.11.2016, 18:00
    #39350052
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
-2-Первый аргумент nvl какого типа?
в случае если первый элемент - параметр или null, что к чему будет приводится?
...
Рейтинг: 0 / 0
18.11.2016, 18:18
    #39350072
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
daunito-2-Первый аргумент nvl какого типа?в случае если первый элемент - параметр или null, что к чему будет приводится?При чём тут мы? Задай этот вопрос сперва себе, даунище. А потом, если у тебя конечно же есть проплаченное потным долларам право, у разработчика того (недо)гуя.
...
Рейтинг: 0 / 0
18.11.2016, 18:40
    #39350079
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
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
19.11.2016, 01:34
    #39350196
daunito
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение oracle sql developer, сравнение дат
ElicПри чём тут мы? Задай этот вопрос сперва себе, даунище. А потом, если у тебя конечно же есть проплаченное потным долларам право, у разработчика того (недо)гуя.
Уж ты тут точно ни при чем. Ни разу ничего полезного от тебя не слышал.

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

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

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

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

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


Вячеслав,

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


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