TO_DATE проблемы - PullRequest
       26

TO_DATE проблемы

7 голосов
/ 22 февраля 2012

У меня в предложении SQL есть следующее.Это работает с базой данных Oracle.Поле sc_dt определено в БД как поле даты.

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')

выдает следующую ошибку "date format picture ends before converting entire input string"

Когда я пытаюсь учесть доли секунды (.0в данном случае) со следующим я получаю следующую ошибку.

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF')

выдает следующую ошибку "date format not recognized"

Я действительно просто предполагаю, что мне нужно .FF дляприходится на .0 в строке "from".Я также попробовал .FF1, .FF2, ..., .FF9 с теми же результатами (на данный момент я хватаюсь за соломинку).

Насколько я вижу,Поле sc_dt всегда содержит заполненную часть месяца / дня / года (а не часть часа / минуты / секунды).

Я отлаживаю Java-программу, которая выполняет вышеуказанный SQL как подготовленный оператор с2011-11-03 00:00:00.0 значение.

Как я могу обойти это?

Ответы [ 5 ]

6 голосов
/ 22 февраля 2012

Вам нужно использовать опцию секунд после полуночи.Что-то вроде:

select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual

Или вот:

select TO_TIMESTAMP('2011-11-03 00:00:00.1', 'YYYY-MM-DD HH24:MI:SS.FF') from dual
5 голосов
/ 23 февраля 2012

Столбец Oracle DATE, такой как sc_dt, всегда будет иметь день и компонент времени с точностью до секунды.В зависимости от вашего инструмента запросов и от того, как он настроен (как правило, NLS_DATE_FORMAT сеанса), возможно, что компонент времени не отображается по умолчанию.Однако вы можете увидеть компонент времени, выполнив явное TO_CHAR

SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' ) 
  FROM table_name

Поскольку DATE сохраняет только время до секунды, однако вы не можете использовать доли секунды в маске формата.Таким образом, вам нужно будет сделать что-то вроде этого, чтобы извлечь только часть строки до доли секунды.Если вы не гарантированы, что строка всегда будет за 19 символов до десятичной точки, вы также можете использовать INSTR, чтобы найти десятичную точку и взять все до этого.исходит из приложения Java, однако, вам гораздо лучше использовать правильный тип данных.Если вы свяжете дату Java (java.sql.Date) с помощью метода setDate в подготовленном операторе вместо привязки строки, вам не придется иметь дело с форматом строки в вашем операторе SQL.

3 голосов
/ 14 апреля 2014

Я понимаю, что этой теме больше года, но ... Другой вариант просто добавить это может быть:

src_dt=select TO_DATE('2011-11-03 00:00:01.1234', 'YYYY-MM-DD HH24:MI:SS.?????') from dual;

Примечание: есть дополнительный '?' добавлено, чтобы проиллюстрировать, что вы можете даже добавить несколько дополнительных символов? Oracle не жалуется, если цифры, представленные символами «?», НЕ имеют соответствующего символа в исходной временной строке. Это может быть полезно, если вы не уверены в точности секунд, которые вы получаете.

Эта опция дает некоторую гибкость формату «доли секунды» от вашего исходного времени. Я не знаю, что это на самом деле где-то задокументировано.

1 голос
/ 16 ноября 2014

Я сделал это:

ALTER SESSION 
SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS.?';


--Change the decimal
ALTER SESSION 
SET NLS_NUMERIC_CHARACTERS = ',.';

И у меня это сработало

0 голосов
/ 22 февраля 2012

src_dt = select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual

Я полагаю, что вышеприведенное должно работать, если вам просто нужно вывести дату.

...