【问题标题】:DateTime on Where Clause Oracle日期时间在 Where 子句 Oracle
【发布时间】:2014-11-04 09:11:36
【问题描述】:

似乎有很多查询语法可以在oracle数据库上获取数据,这里我只想问一下运行良好但我完全无法理解的查询。查询是:

Select
....
From
...
Where
TO_CHAR(TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS') +
(create_date  / ( 60 * 60 * 24 )),
'MM/DD/YY HH24:MI:SS') = '06/30/14 21:41:11'
;

从上面的查询中可以正常工作。但我不明白为什么会有 TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS(create_date / ( 60 * 60 * 24)), 'MM/DD/YY HH24:MI:SS')

create_date 字段上显示 unix 日期时间,例如 1404164471

有人能解释一下吗?

提前致谢

【问题讨论】:

    标签: oracle datetime


    【解决方案1】:

    TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 将特定格式(第二个参数)的字符串(第一个参数)转换为日期。

    (create_date / ( 60 * 60 * 24 )) create_date 包含秒,此表达式将它们转换为天数(1 分钟 = 60 秒,1 小时 = 60 分钟,1 天 = 24 小时 => 60*60* 24 = 一天中的秒数)。当您将数字添加到日期时,Oracle 认为该数字包含天数,这就是您需要进行此类对话的原因。

    TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS') + (create_date / ( 60 * 60 * 24 )) 为您提供一个存储在 create_date 中但采用“传统”格式的日期

    您似乎需要将 unix 时间与日期进行比较。最好使用这个条件:

    Select
    ....
    From
    ...
    Where create_date = trunc( (TO_DATE('06/30/14 21:41:11', 'MM/DD/YY HH24:MI:SS') 
                              - TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
                               ) * 24 * 60 * 60
                             );
    

    【讨论】:

    • 我知道了,所以这个 TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 查询用于定义第一个默认时间机器可读然后我必须将它添加到 create_date 字段的天数以计算从第一个默认时间到选定日期的长度,然后将其转换为适当的日期格式?
    • @Rezaakhmadg 是的,但你不需要这个:“然后将其转换为日期”。当您将日期添加到日期时,您会收到一个日期,因此您无需再次转换它
    • 为什么要在 create_date 字段中按一天添加此查询 TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS')?
    • @Rezaakhmadg 从您的 WHERE 子句看来,您需要将 unix 时间的 create_date 与一些普通日期进行比较。在这种情况下,您有两个选择:1)将 unix 时间转换为普通日期格式; 2) 将普通日期转换为 unix 时间。你做了第一个。
    • @Rezaakhmadg Unix 时间是自 1970 年 1 月 1 日以来的秒数,这就是为什么你得到 1970 年 1 月 1 日并将 create_date 添加到它的原因。
    【解决方案2】:

    外部 to_char(,) 从计算的日期创建一个字符串。这样可以与字符串 '06/30/14 21:41:11' 进行比较。

    在 to_char 内部正在进行一些计算,添加到日期值。

    TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    + (create_date  / ( 60 * 60 * 24 ))
    

    to_date 函数接受一个字符串格式的日期值 ('01/01/1970 00:00:00') 和一个格式字符串 ('MM/DD/YYYY HH24:MI:SS') 来告诉它如何解释日期值。

    create_date 似乎是一个以秒为单位的数字 9 可能自 1970 年 1 月 1 日以来)。它除以一天中的秒数,从而得出天数。所以你得到的是实际日历值中的创建日期。

    【讨论】:

    • 所以如果我想将字符串转换为日期格式,我应该输入 TO_DATE('01/01/1970 00:00:00', 'MM/DD/YYYY HH24:MI:SS')第一的?并且此代码有必要+(create_date /(60 * 60 * 24))?第一个代码转换为日期,第二个代码是整数值,这两个代码上的添加运算符是什么
    • 加法发生在 to_char( ,
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2016-09-07
    • 2023-03-21
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多