【问题标题】:How to cast full Timestamp into Date in Oracle?如何在 Oracle 中将完整的时间戳转换为日期?
【发布时间】:2019-10-18 10:26:49
【问题描述】:

我正在尝试在 Oracle 中投射 2 个 datetimetamps,结果如预期的那样'dd-mmm-yyyy', 但是当我减去这两个日期时,我没有得到它们之间的四舍五入天数,而是有小数位。

EXT_DATETIMESTAMP 的格式为:'25-SEP-19 01.35.39.000000000 PM +07:00'

我对两列都使用 CAST(EXT_DATETIMESTAMP as date),结果如下:

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 

在这种情况下我应该使用哪种类型的转换来获得没有小数的预期结果?

谢谢

【问题讨论】:

  • Ude Datediff 函数..
  • @KiranPatil DATEDIFF 不是有效的 Oracle 函数。
  • 你用的是哪个数据库?
  • @KiranPatil 查看问题下方的标签,您会看到oracle 标签。

标签: sql oracle date datetime casting


【解决方案1】:

DATE 数据类型始终具有年、月、日、小时、分钟和秒组件。

TIMESTAMP 数据类型始终具有相同的组件,并且可以包含小数秒和时区信息。

因此,如果您将CASTTIMESTAMP 变为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

输出:

时间戳 |时间戳 | 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

db小提琴here

【讨论】:

    【解决方案2】:

    区别两边使用TRUNC

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

    Demo

    【讨论】:

      【解决方案3】:

      试试下面的查询...

      SELECT TO_DATE('2000-01-05', 'YYYY-MM-DD') -  
             TO_DATE('2000-01-01', 'YYYY-MM-DD') AS DateDiff
      FROM   dual
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        • 2012-04-02
        • 2021-11-22
        相关资源
        最近更新 更多