【问题标题】:CAST(CURRENT_TIMESTAMP AS TIME)CAST(CURRENT_TIMESTAMP AS TIME)
【发布时间】:2019-01-24 23:22:32
【问题描述】:

我正在尝试使用时间戳并从中处理数据,以便我可以测量数据库中的不同内容。

目前我有一列包含“DATE”,但实际上包含一个完整的标记 'DD/MM/YYYY HH24:MI:SS'

我希望能够获取“09:00”和“09:15”之间“DTIME”但无法正确转换的所有条目。

如果我要在不进行任何转换的情况下输出该列,它将如下所示

  SELECT ia.DTIME3
  FROM ISIS_AUDIT ia
  WHERE ia.DTIME3 like to_date('24/01/2019', 'DD/MM/YYYY');

输出:19 年 1 月 24 日

如果我要将它转换为_char,

  SELECT to_char(ia.DTIME3, 'DD/MM/YYYY HH24:MI:SS')
  FROM ISIS_AUDIT ia
  WHERE ia.DTIME3 like to_date('24/01/2019', 'DD/MM/YYYY');

输出:24/01/2019 07:10:52

我希望能够使用此 DTIME3 并查找时间之间的条目,但 CAST 和 CONVERT to TIME 不起作用。

这是我的工作选项,但它仍然输出日期,我不想指定日期,因此它可以在一周中的任何一天运行。

  WHERE ia.DTIME3 between to_date('24/01/2019 09:00:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('24/01/2019 09:15:00', 'DD/MM/YYYY HH24:MI:SS');

输出:24/01/2019 09:00:01

【问题讨论】:

  • between 包括在内;您真的想准确地包含 09:15:00,还是实际上只包含 09:14:59.999...?后者看起来更有可能——这就是 GMB 使用extract 的第二种方法将做的,因为<。

标签: sql database oracle date where-clause


【解决方案1】:

目前我有一列包含“DATE”,但实际上包含一个完整的标记 'DD/MM/YYYY HH24:MI:SS'

这就是Oracle DATE datatype 所做的:存储日期和时间(没有小数秒,属于TIMESTAMP 数据类型)。 Oracle 中没有专门的日期格式(没有时间)。

要过滤一天中的时间,您可以使用the TO_CHAR() function 将您的日期转换为表示其时间的字符串,并且您可以进行比较:

TO_CHAR(ia.DTIME3, 'hh24:mi') BETWEEN '09:00' AND '09:14'

您还可以将CAST 日期转换为时间戳并使用the EXTRACT() function:

EXTRACT(HOUR FROM CAST(ia.DTIME3 AS TIMESTAMP)) = 9 
AND EXTRACT(MINUTE FROM CAST(ia.DTIME3 AS TIMESTAMP)) < 15

【讨论】:

    【解决方案2】:

    Oracle 有DATE 和TIMESTAMP 数据类型;两者都有年、月、日、小时、分钟、秒的组成部分(TIMESTAMP 也有小数秒)。 Oracle 没有TIME 数据类型。

    改为使用TRUNC() 将时间部分截断为午夜,并添加一个区间文字:

    SELECT *
    FROM   ISIS_AUDIT
    WHERE  DTIME BETWEEN TRUNC( DTIME ) + INTERVAL '09:00' HOUR TO MINUTE
                 AND     TRUNC( DTIME ) + INTERVAL '09:15' HOUR TO MINUTE;
    

    【讨论】:

    • 感谢回复,我试试这个方法看看会发生什么。
    • 我确实找到了一种访问数据时间的方法,但是如果我想检查“开始时间”和“结束时间”是否介于“09:00”和“09:15”之间“我怎么能这样做。
    • @DavidZammit 只需将DTIME 替换为START_TIME,然后为END_TIME 添加一个重复的BETWEEN 子句。
    【解决方案3】:
    and ia.DTIME1 not between to_date('&&S_DATE 08:50:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('&&S_DATE 09:20:00', 'DD/MM/YYYY HH24:MI:SS')               
                    and ia.DTIME1 not between to_date('&&S_DATE 11:50:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('&&S_DATE 12:40:00', 'DD/MM/YYYY HH24:MI:SS') 
                    and ia.DTIME3 not between to_date('&&S_DATE 08:50:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('&&S_DATE 09:20:00', 'DD/MM/YYYY HH24:MI:SS')               
                    and ia.DTIME3 not between to_date('&&S_DATE 11:50:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('&&S_DATE 12:40:00', 'DD/MM/YYYY HH24:MI:SS')
    

    我试图这样做,但是我注意到如果我的开始时间为 08:30,结束时间为 09:30,那么它介于 09:00 和 09:15 之间,所以我想将其排除在桌子。我当前使用的 WHERE 子句非常具体,仅当时间戳包含指定的值时才会排除。

    真的会想读“DTIME1 到 DTIME3 不在 09:00 和 09:15 之间”

    【讨论】:

    • 只需还原我提供给您的WHERE 子句:WHERE NOT( EXTRACT(HOUR FROM ia.DTIME3) = 9 AND EXTRACT(MINUTE FROM ia.DTIME3) &lt; 15 )。 PS:您的这个答案应该作为对您问题的编辑或对其他答案的评论发布。
    • 感谢您的反馈,我会看看它是如何运行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2022-12-02
    • 2021-01-07
    • 2012-06-12
    • 2014-10-08
    • 2018-11-18
    • 2021-07-10
    相关资源
    最近更新 更多