A DATE
тип данных всегда имеет компоненты года, месяца, дня, часа, минуты и секунды.
A TIMESTAMP
тип данных всегда имеет одинаковые компоненты, плюс может иметь дробные секунды и информацию о часовом поясе.
Итак, если вы CAST
с TIMESTAMP
до DATE
, все, что вы делаете, это отбрасывает дробные секунды и информацию о часовом поясе;у вас все еще будут часы, минуты и секунды.
Если вам нужны только компоненты год / месяц / день, не используйте CAST
;вместо этого используйте TRUNC
, который вернет усеченный тип данных DATE
обратно к полуночи того же дня:
SELECT TimestampA,
TimestampB,
TRUNC( TimestampA ) - TRUNC( TimestampB ) AS days_difference
FROM your_table
Если у вас есть информация о часовом поясе, тогда преобразуйте значения в общий часовой пояс (обычноUTC), а затем обрезать их:
Установка Oracle :
CREATE TABLE your_table ( timestampA, timestampB ) AS
SELECT TIMESTAMP '2019-09-25 07:00:00.000000000 +07:00', TIMESTAMP '2019-09-27 03:00:00.000000000 +04:00' FROM DUAL
Запрос :
SELECT TimestampA,
TimestampB,
TimestampA AT TIME ZONE 'UTC' AS utcA,
TimestampB AT TIME ZONE 'UTC' AS utcB,
TRUNC( TimestampA AT TIME ZONE 'UTC' ) - TRUNC( TimestampB AT TIME ZONE 'UTC' ) AS days_difference
FROM your_table
Выводы:
TIMESTAMPA | TIMESTAMPB | UTCA | UTCB | DAYS_DIFFERENCE
:----------------------------- | :----------------------------- | :-------------------------- | :-------------------------- | --------------:
2019-09-25T07:00:00.000 +07:00 | 2019-09-27T03:00:00.000 +04:00 | 2019-09-25T00:00:00.000 UTC | 2019-09-26T23:00:00.000 UTC | -1
дБ <> скрипка здесь