2013-04-18 9 views
5

У меня есть datetime столбец в Oracle (MM/DD/YYYY HH: MM: SS AM/PM), но когда я делаю это:Вычесть один час от даты-времени, а не один день

SELECT MAX(D_DTM)-1 FROM tbl1 

. .. он возвращается в день. Как удалить один час из столбца, а не один день?

Я также заметил, что datetime записи для 12AM выглядят как MM/DD/YYYY и не MM/DD/YYYY 00:00:00; Я не уверен, что это важно.

+0

Как вы просматриваете значения 12AM? Это через SQLPlus или внешний интерфейс (C#, PHP и т. Д. И т. Д.)? –

+0

с помощью Toad, является ли это проблемой?Я новичок в Oracle env – user2061886

+0

Это может быть TOAD, но я не знаком с TOAD. Если все остальные даты в столбце показывают, что компонент времени и даты «полуночи» этого не делают, я думаю, что можно с уверенностью предположить, что «полночь» действительно существует, а TOAD просто «помогает» скрывать ее. Может быть настройка, в которой вы можете включить или отключить эту функцию, но это только предположение. Я знаю, что языки .NET и PHP будут распознавать временную часть - даже если она равна нулю - и, вероятно, примерно любой другой язык тоже. –

ответ

13

Randy's answer это хорошо, но вы также можете использовать интервалы:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1 
+0

лучший ответ IMO, более понятный для будущих кодеров, чтобы знать, что происходит – user2061886

4

Да - даты, отправленные целыми днями.

если вы хотите часы вы должны сделать некоторую математику - как -(1/24)

5

Или использовать функцию INTERVAL. Она имеет тот же результат, но я думаю, что он читает более ясно - это, конечно, просто мнение :)

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1 

Хорошая вещь о функции INTERVAL является то, что вы можете сделать интервал быть годы, месяцы, дни, часы , минут или секунд при работе с значением DATE, хотя интервал месяца может быть сложным при работе с датами конца месяца.

И да, требуется цитата вокруг 1 в примере.

Можно также использовать Oracle-специфическую NumToDSInterval функцию, которая является менее стандартной, но более гибким, поскольку он принимает переменные вместо константы:

SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1 
2

Другой метод с использованием интервалов

NUMTODSINTERVAL(number, expression) 

примеры

NUMTODSINTERVAL(150, 'DAY') 
NUMTODSINTERVAL(1500, 'HOUR') 
NUMTODSINTERVAL(15000, 'MINUTE') 
NUMTODSINTERVAL(150000, 'SECOND') 

Я приношу это beca использование полезно для ситуаций, когда использование INTERVAL не работает.

1

Его простота.

SYSDATE - 5/(24 * 60 * 60) -> Вычитание 5 секунд от SysTime

SYSDATE - 5/(24 * 60) -> Вычитание 5 минут от SysTime

SYSDATE - 5/(24) -> Вычитание 5 часов от SysTime

Следовательно

выберите (SYSDATE - (1/24)) от двойного

+0

Можете ли вы подробнее рассказать о своем ответе, например, почему вы используете деление для вычитания? –

+0

@CodyGuldner. Разделение вычисляет значение как долю дней. (1 час - 1/24 дня, поэтому 5/24 дня - 5 часов). Вычитание затем вычитает день. Лично, однако, я буду беспокоиться о ошибках с плавающей запятой. – jpmc26

+0

@ jpmc26 Идея состоит в том, что подобная информация должна быть включена в ответ. –

Смежные вопросы