2017-01-24 4 views
-1

У меня есть представление в Oracle DB, который имеет поле под названием UPDATE_DATEКак использовать текущую дату в котором положение

enter image description here

Мне нужно, чтобы выбрать все поля зрения, если UPDATE_DATE равно к вчерашней дате (может быть текущая дата -1). Я попробовал

select * from ack where update_date = SYSDATE - 1 

Но он не возвращает никаких данных. Я вижу вчерашние даты в БД.

+0

Тип данных столбца? – jarlh

ответ

0

Try:

select * from ack where trunc(update_date) = trunc(SYSDATE - 1) 

Что вы вывесили, как представлены даты они, вероятно, также содержат часть с часами и минутами и так далее. trunc вырезать точность до дней. Пожалуйста, выполните:

select to_char(update_date,'dd-mon-yyyy hh24:mi:ss') update_date, sysdate - 1 as curr_date from ack; 

Вы сравниваете эти значения и не идентичны. Вот почему вы не получаете никаких результатов.

1

Вы не можете видеть все данные, так как SYSDATE и update_date колонок имеют временную составляющую (все DATE и TIMESTAMP типов данных имеют), но IDE вы используете только выбрать, чтобы не показать его вам. До change this behaviour in SQL Developer see here.

Это будет использовать любые индексы у вас на update_date колонки:

SELECT * 
FROM ack 
WHERE update_date >= TRUNC(SYSDATE) - INTERVAL '1' DAY 
AND update_date < TRUNC(SYSDATE); 

Это будет использовать индекс-функцию на TRUNC(update_date), но не будет использовать индекс на update_date колонки:

SELECT * 
FROM ack 
WHERE TRUNC(update_date) = TRUNC(SYSDATE) - INTERVAL '1' DAY; 
-1

Мне нравится «CURRENT_TIMESTAMP» над «SYSDATE» - оба должны делать то же самое, но читаемость проходит долгий путь.

Я бы порекомендовал вам накладывать «UPDATE_DATE» на DATE (если он в datetime), то используйте CAST и DATEADD, чтобы настроить «сейчас» на «вчера».

WHERE 
    CAST(update_date AS DATE) = CAST(DATEADD(day,-1,current_timestamp) AS DATE) 

EDIT: Пожалуйста, не используйте (Дата-1) это неаккуратно код и может иметь нежелательные последствия при использовании в качестве части некоторых функций.

+0

В Oracle, 'CURRENT_TIMESTAMP',' CURRENT_DATE', 'SYSTIMESTAMP' и' SYSDATE' ** не ** совпадают. 'CURRENT_DATE' и' CURRENT_TIMESTAMP' возвращает тип данных даты/времени (соответственно), отражающий текущую дату и время на * клиенте * (оба имеют компонент времени, метка времени также имеет дробные секунды). 'SYSDATE' и' SYSTIMESTAMP' возвращает тип данных date/timestamp (соответственно), отражающий текущую дату/время на * сервере * (опять же, оба имеют компонент времени). Если клиент и сервер находятся в разных часовых поясах, вы увидите разницу между ними. – MT0

+0

'DATEADD()' не является допустимой функцией Oracle, и нет такой вещи, как тип данных DATETIME; все 'DATE' имеют временную составляющую. 'SYSDATE - 1' - совершенно правильный код в Oracle - если вы хотите явно определить интервал, используйте« SYSDATE - INTERVAL »1« DAY ». – MT0

+0

Я понимаю разницу, и по моему опыту клиент будет правильным, если они разные. Это для исправления меня в «DATEADD» - я использую ADD_MONTHS и знаю, что ADD_DAYS не было, но я думаю, что важно вызывать интервал «ДЕНЬ», я видел какой-то странный вывод. –

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