【问题标题】:Getting time of Sysdate Oracle获取 Sysdate Oracle 的时间
【发布时间】:2021-06-04 21:14:45
【问题描述】:

我写了这行代码来获取日期和时间,从 int 数据类型到时间戳:

(to_timestamp(cast(theDate* 1000000 + theTime as varchar2(255)), 'YYYYMMDDHH24MIss'))

我需要将它添加到 where 子句中以仅获取日期 + 时间小于 5 小时的位置

当前日期,为了更清楚,我需要查询仅显示 sysdate 过去 5 小时的日期。

类似这样的:

Where hour((to_timestamp(cast(theDate* 1000000 + theTime as varchar2(255)), 'YYYYMMDDHH24MIss'))) - hour(sysdate) < 5

如果我可以在 oracle 上使用 datediff,我将使用它,例如:

where datediff('HOUR', (imrecorddate, imrecordtime), sysdate)

我想得到一些帮助,因为我没有在网上找到它。

谢谢。

【问题讨论】:

  • 样本数据和所需结果会有所帮助。这是什么意思“只显示 sysdate 过去 5 小时的日期。”
  • 将日期和时间分别存储为整数的原因是什么?如果您将其直接存储为日期时间(在 Oracle 中称为 DATE),则不需要所有这些转换,并且编写查询会容易得多。

标签: sql oracle


【解决方案1】:

如果您需要最后五个小时,则只需使用日期/时间比较。假设没有未来的日期/时间:

where (to_timestamp(cast(theDate* 1000000 + theTime as varchar2(255)), 'YYYYMMDDHH24MIss')) >= current_timestamp - interval '5' hour

【讨论】:

  • 非常感谢。但我收到此错误 01878。00000 -“在日期时间或间隔中找不到指定的字段” *原因:在日期时间或间隔中找不到指定的字段。 *Action:确保指定的字段在日期时间或时间间隔内。
  • @EfraimEfiGavrieli 。 . .这是完全使用您问题中的逻辑,其后带有` >= current_timestamp - interval '5' hour`。第二部分是正确的。
【解决方案2】:

假设您有一张桌子:

CREATE TABLE table_name (
  thedate INT,
  thetime INT
);

(这是一种不好的做法,您应该只使用一个支持相同日期和时间组件的 DATE 列。)

和样本数据:

INSERT INTO table_name ( thedate, thetime )
WITH dates ( dt ) AS (
  SELECT SYSDATE - INTERVAL '04:59:58' HOUR TO SECOND FROM DUAL UNION ALL
  SELECT SYSDATE - INTERVAL '04:59:59' HOUR TO SECOND FROM DUAL UNION ALL
  SELECT SYSDATE - INTERVAL '05:00:00' HOUR TO SECOND FROM DUAL UNION ALL
  SELECT SYSDATE - INTERVAL '05:00:01' HOUR TO SECOND FROM DUAL
)
SELECT TO_CHAR( dt, 'YYYYMMDD' ), TO_CHAR( dt, 'HH24MISS' ) FROM dates;

那么你可以这样做:

SELECT *
FROM   table_name
WHERE  TO_DATE( thedate||TO_CHAR(thetime, 'FM000000'), 'YYYYMMDDHH24MISS' )
         >= SYSDATE - INTERVAL '5' HOUR;

哪个会输出:

THEDATE THETIME
20210604 90321
20210604 90320
20210604 90319

现在,如果您的表在 UTC 时区存储值并且您的系统时间在不同的时区,那么您需要包含时区:

SELECT *
FROM   table_name
WHERE  TO_TIMESTAMP_TZ(
         thedate||TO_CHAR(thetime, 'FM000000')||'+0000',
         'YYYYMMDDHH24MISSTZHTZM'
       ) >= SYSTIMESTAMP - INTERVAL '5' HOUR;

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2010-11-12
    • 2021-12-17
    • 2020-08-14
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多