2013-11-11 3 views
0

У меня есть таблица с двумя временными столбцами. Сначала (имя DATE) хранится дата (не включая временную часть), и поэтому тип данных DATE. Второй столбец (имя TIME) предназначен для хранения времени в секундах, и поэтому тип данных равен NUMBER.Сравнить дату + время с меткой времени

Мне нужно сравнить эти две даты с меткой времени из другой таблицы. Как я могу рассчитать дату двух столбцов (DATE и TIME) и сравнить с меткой времени другой таблицы?

Я попытался вычислить часы из колонки времени и добавить его в столбец даты, но выход, кажется, не правильно:

SELECT to_date(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable; 

Выход только дату, но не компонент времени ,

+0

вы можете выбрать минуты (даты) и выполнить сравнение, или вы можете использовать DATETIME, который имеет формат: ГГГГ-ММ-ДД ЧЧ: ММ: SS – user1658435

ответ

2

date + (time/3600)is already a DATE, поэтому вам не нужно делать to_date(). У него есть часть времени, которую вы добавили, но вы просто не показываете ее. Если вы хотите вывести, что в виде строки в формате вы показали, используйте to_char() вместо:

SELECT to_char(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable; 

... за исключением того, что если time на самом деле в секундах, вам нужно разделить на 86400 (24x60x60), а не 3600. В настоящий момент вы полагаетесь на формат даты по умолчанию вашего клиента, возможно, NLS_DATE_FORMAT, который не включает в себя временную часть от того, что вы сказали. Это не значит, что времени там нет, оно просто не отображается.

Но это только для отображения. Оставьте это как дату, просто добавив два значения, сравнивая с вами временную метку, например.

WHERE date + (time/86400) < systimestamp 
3

Вы можете использовать тип INTERVAL DAY TO SECOND:

SELECT your_date + NUMTODSINTERVAL(your_time_in_seconds, 'SECOND') FROM dual; 

Пример:

SELECT TRUNC(SYSDATE) + NUMTODSINTERVAL(39687, 'SECOND') FROM dual; 

Рассчитанная дата со временем является: 10-11-2013 11:01:27

Это лучшая идея, чем Разделив значение на 3600, на мой взгляд, поскольку у вас есть интервал в секундах, так что чувствует естественным использование интервала для представления вашего времени, которое затем может быть легко добавлено в столбец типа данных DATE.

Oracle Interval in Documentation

NUMTODSINTERVAL Function in documentation

0

Попробуйте, как это,

SELECT TO_DATE('11/11/2013','dd/mm/yyyy') + 3600/60/60/24 FROM DUAL; 

Ваш запрос,

SELECT date + time/60/60/24 FROM mytable; 
0

попробуйте использовать to_timestamp вместо to_date

+0

Тип 'DATE' имеет компонент времени, поэтому используя временная метка не обязательно помогает; хотя, возможно, было бы полезно убедиться, что сравнение выполняется между отметками времени, я полагаю. –

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