Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 А как дату со строкой сравнивать?  [new]
Sarin
Member

Откуда: Земля, Солнечная система.
Сообщений: 14480
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4='2006.08.19 10:42:28'
ругается ORA-01861: literal does not match format string
Можноли строку записать так, чтоб оракл мог её с датой сравнить?
19 июл 06, 14:10    [2899806]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Sarin
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4='2006.08.19 10:42:28'
ругается ORA-01861: literal does not match format string
Можноли строку записать так, чтоб оракл мог её с датой сравнить?

SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4=TO_DATE('2006.08.19 10:42:28','yyyy.mm.dd hh24:mi:ss')
19 июл 06, 14:11    [2899818]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
zirex
Member

Откуда:
Сообщений: 714
можно
AND F4=TO_DATE('2006.08.19 10:42:28', 'YYYY.MM.DD HH24:MI:SS')
19 июл 06, 14:12    [2899826]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Sarin
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4='2006.08.19 10:42:28'
ругается ORA-01861: literal does not match format string
Можноли строку записать так, чтоб оракл мог её с датой сравнить?

Можно, только надо знать какой date format используется для сессии.
SQL> select value from nls_session_parameters where parameter='NLS_DATE_FORMAT';

VALUE
----------------------------------------
DD-MON-RR
19 июл 06, 14:13    [2899838]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
И это почитать будет очень полезно

Data Conversion
19 июл 06, 14:16    [2899854]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
SeaGate
Можно, только надо знать какой date format используется для сессии.

alter session set nls_date_format отменили? =)
19 июл 06, 14:16    [2899858]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
SeaGate
Sarin
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4='2006.08.19 10:42:28'
ругается ORA-01861: literal does not match format string
Можноли строку записать так, чтоб оракл мог её с датой сравнить?

Можно, только надо знать какой date format используется для сессии.
SQL> select value from nls_session_parameters where parameter='NLS_DATE_FORMAT';

VALUE
----------------------------------------
DD-MON-RR

А вот заточки на определенные настройки - дело нехорошее.
19 июл 06, 14:39    [2900037]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Apex
SeaGate
Sarin
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4='2006.08.19 10:42:28'
ругается ORA-01861: literal does not match format string
Можноли строку записать так, чтоб оракл мог её с датой сравнить?

Можно, только надо знать какой date format используется для сессии.
SQL> select value from nls_session_parameters where parameter='NLS_DATE_FORMAT';

VALUE
----------------------------------------
DD-MON-RR

А вот заточки на определенные настройки - дело нехорошее.

Предложил первое, что пришло на ум после to_date и что не требует изменения окружения клиента. То, что это плохо - конечно, знаю.
19 июл 06, 14:50    [2900127]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
M_IV
Member

Откуда:
Сообщений: 1303
Sarin
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND F4='2006.08.19 10:42:28'
ругается ORA-01861: literal does not match format string
Можноли строку записать так, чтоб оракл мог её с датой сравнить?

SELECT COUNT(*) FROM Z_SOME_TABLE WHERE TO_CHAR(F1,'YYYY.MM. DD HH24:Mi:SS')='1' AND F4='2006.08.19 10:42:28'
19 июл 06, 15:20    [2900349]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
M_IV
Member

Откуда:
Сообщений: 1303
Sorry:
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND TO_CHAR(F4,'YYYY.MM. DD HH24:Mi:SS')='2006.08.19 10:42:28'
19 июл 06, 15:22    [2900367]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
SeaGate

Предложил первое, что пришло на ум после to_date и что не требует изменения окружения клиента. То, что это плохо - конечно, знаю.

Я знаю, что ты знаешь, а вот Sarin с дуру мог бы зашить это в код :)
Хотя.... :)
19 июл 06, 15:30    [2900412]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
Aestet
Member

Откуда: СПб-->Мюнхен
Сообщений: 43
M_IV
Sorry:
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND TO_CHAR(F4,'YYYY.MM. DD HH24:Mi:SS')='2006.08.19 10:42:28'


Если поле F4 индексировано, то так поступать не следует
19 июл 06, 15:37    [2900459]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Aestet
M_IV
Sorry:
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND TO_CHAR(F4,'YYYY.MM. DD HH24:Mi:SS')='2006.08.19 10:42:28'


Если поле F4 индексировано, то так поступать не следует

Ну, давайте сюда еще и FBI приплетем
19 июл 06, 15:38    [2900465]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
M_IV
Member

Откуда:
Сообщений: 1303
Aestet
M_IV
Sorry:
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND TO_CHAR(F4,'YYYY.MM. DD HH24:Mi:SS')='2006.08.19 10:42:28'


Если поле F4 индексировано, то так поступать не следует

19 июл 06, 15:45    [2900514]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
Aestet
Member

Откуда: СПб-->Мюнхен
Сообщений: 43
SeaGate
Aestet
M_IV
Sorry:
SELECT COUNT(*) FROM Z_SOME_TABLE WHERE F1='1' AND TO_CHAR(F4,'YYYY.MM. DD HH24:Mi:SS')='2006.08.19 10:42:28'


Если поле F4 индексировано, то так поступать не следует

Ну, давайте сюда еще и FBI приплетем


Может, КГБ?
19 июл 06, 15:50    [2900530]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
iamhere
Member

Откуда:
Сообщений: 186
Apex
А вот заточки на определенные настройки - дело нехорошее.


Если вы про жесткое прописывание формата, то это зависит от задачи.

А если задача стоит так - считать дату из файла, который присылают из внешней органимзации в ОГОВОРЕННОМ ФОРМАТЕ? ;)
19 июл 06, 16:27    [2900767]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
Sarin
Member

Откуда: Земля, Солнечная система.
Сообщений: 14480
Спасибо всем большое. Я читал про ковертацию строки в дату...

Меня ввели в заблуждение сказав что для сравнения строки с датой строку в дату конвертить не обязательно.
19 июл 06, 16:59    [2901005]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Sarin
Спасибо всем большое. Я читал про ковертацию строки в дату...
Меня ввели в заблуждение сказав что для сравнения строки с датой строку в дату конвертить не обязательно.

Давайте внесем ясность.
Просто сравнить значения разных типов невозможно.
Поэтому для такого сравнения применяется преобразование типов.
Вы можете сделать это явно, можете не делать - тогда oracle сделает это за Вас.
Если Вы делаете преобразование явно, то можете указать маску формата.
Если приобразование выполняется неявно, то маска формата берется из параметров сессии - NLS_DATE_FORMAT.
Соответственно чтобы не писать to_date(), Вам необходимо обеспечить соответствие Вашей строки маске формата.
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв масе
2) изменить маску формата посредством alter session set nls_date_format
19 июл 06, 17:03    [2901032]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
Sarin
Member

Откуда: Земля, Солнечная система.
Сообщений: 14480
Спасибо.
19 июл 06, 18:17    [2901586]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
andrey_anonymous
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв масе
2) изменить маску формата посредством alter session set nls_date_format

способ №3:
прописать в environment variables на клиенте.
20 июл 06, 06:07    [2902550]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
SeaGate
andrey_anonymous
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв масе
2) изменить маску формата посредством alter session set nls_date_format

способ №3:
прописать в environment variables на клиенте.

Мне не кажется это удачным вариантом. Та же зависимость, что и в варианте 1, только в первом случае от БД, а в Вашем от компьютера. Что так, что так мы можем использовать только единственный вариант преобразования
DD/MM/YYYY, но не DD-MM-RR.
Если по непонятным для меня причинам и отказываться от явного преобразования типов, то использовать надо второй вариант. Он по крайней мере дает требуемую гибкость и избавляет от клиентской / БД зависимости.
Для этого правда маску формата нужно выставлять в любом случае вне зависимости от предыдущих установок.
20 июл 06, 08:05    [2902646]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
dmidek
SeaGate
andrey_anonymous
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв масе
2) изменить маску формата посредством alter session set nls_date_format

способ №3:
прописать в environment variables на клиенте.

Мне не кажется это удачным вариантом. Та же зависимость, что и в варианте 1, только в первом случае от БД, а в Вашем от компьютера. Что так, что так мы можем использовать только единственный вариант преобразования
DD/MM/YYYY, но не DD-MM-RR.
Если по непонятным для меня причинам и отказываться от явного преобразования типов, то использовать надо второй вариант. Он по крайней мере дает требуемую гибкость и избавляет от клиентской / БД зависимости.
Для этого правда маску формата нужно выставлять в любом случае вне зависимости от предыдущих установок.

Здесь можно удумать доводы как за, так и против. Лично я сторонник явного преобразования.
Но рассмотрим такую задачу: приложение осуществляет взаимодействие с БД посредством отправки данных по сети в столь любимом формате XML. Соответственно, в каком-то элементе XML, программист СУБД ожидает строку даты.
Как Вы здесь организуете независимость от клиента?
Мне кажется, никак. Уже масса проблем возникает из-за ошибок в клиентском ПО, из-за которых мне вместо даты будет приходить всякий мусор. А если еще не исключать подмену отправленных пакетов по сети, то становится совсем грустно...
20 июл 06, 09:02    [2902820]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
SeaGate
andrey_anonymous
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв маске
2) изменить маску формата посредством alter session set nls_date_format

способ №3:
прописать в environment variables на клиенте.

"Способ №3" соответствует "способу №1", если немного задуматься ;)
20 июл 06, 09:34    [2902927]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
andrey_anonymous
SeaGate
andrey_anonymous
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв маске
2) изменить маску формата посредством alter session set nls_date_format

способ №3:
прописать в environment variables на клиенте.

"Способ №3" соответствует "способу №1", если немного задуматься ;)

"Способ №3" - это альтернатива оригинальному "Способу №2":
andrey_anonymous
Вам необходимо обеспечить соответствие Вашей строки маске формата.
Это можно сделать двумя способами:
1) переписать строку так, чтобы она соответствовалв масе
2) изменить маску формата посредством alter session set nls_date_format

Отсюда следует тривиальный логический вывод: ("Способ №3" соответствует "способу №1", если немного задуматься) and ("Способ №3" - это альтернатива оригинальному "Способу №2") => "Способ№2" соответствует "Способу№1", если немного задуматься
20 июл 06, 09:39    [2902949]     Ответить | Цитировать Сообщить модератору
 Re: А как дату со строкой сравнивать?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
SeaGate
"Способ №3" - это альтернатива оригинальному "Способу №2"

Не совсем. Все дело в контексте.
20 июл 06, 09:43    [2902957]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить