Как привести полную метку времени в дату в Oracle? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь наложить 2 метки даты и времени в Oracle, и результат, как и ожидалось, 'dd-mmm-yyyy', но когда я вычитаю эти две даты, я не получаю округленное число дней между ними, вместо этого у меня есть десятичные разряды.

EXT_DATETIMESTAMP в формате: '25 -SEP-19 01.35.39.000000000 PM +07: 00 '

Я использую CAST (EXT_DATETIMESTAMP в качестве даты) для обоих столбцов, и мой результат похож на этот:

DateA             DateB              DateA - DateB
25-Sep-2019       25-Sep-2019              0
25-Sep-2019       26-Sep-2019             -1.00084490740740740740740740740740740741
25-Sep-2019       27-Sep-2019             -2.00315972222222222222222222222222222222 

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 октября 2019

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

дБ <> скрипка здесь

0 голосов
/ 18 октября 2019

Попробуйте ниже Query ...

SELECT TO_DATE('2000-01-05', 'YYYY-MM-DD') -  
       TO_DATE('2000-01-01', 'YYYY-MM-DD') AS DateDiff
FROM   dual
0 голосов
/ 18 октября 2019

Используйте TRUNC с обеих сторон разницы:

SELECT
    DateA,
    DateB,
    TRUNC(DateA) - TRUNC(DateB) AS diff
FROM yourTable;

screen capture from demo

Демо

...