【问题标题】:How do I convert a timestamp to hours?如何将时间戳转换为小时?
【发布时间】:2015-11-06 19:08:49
【问题描述】:

我在 Oracle 中执行以下查询:

字段“NO”是数字,字段“DATETIME”是时间戳。

select
    ARC.NO,
    MAX(ARC.DATETIME) - MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
FROM archivo ARC
GROUP BY ARC.NO;

结果是:

NO 256  
DATETIME 1 8:8:41.0 

我看到“1”显示在左侧,然后显示了一段时间。

我想知道是否可以显示 16:17:22(即 8.8:41:0 X 2),因为它应该是 16:17:22。

【问题讨论】:

  • 如果您可以编辑您的问题以包含archivo 表的CREATE 语句和您从中选择的那些行的INSERT 语句将会很有帮助。
  • 1 是一天;你确定你期待 16:17:22 而不是 32:08:41(24 + 8 小时)吗?时间 2 是从哪里来的?
  • 可能是 this question 的副本,但取决于对先前评论的回复...

标签: oracle timestamp


【解决方案1】:

当您从另一个the result is an interval 中减去一个时间戳时。你可以看到的值,1 8:8:41.0,代表 1 天 8 小时 8 分钟 41 秒。不清楚为什么您认为结果应该是该结果的两倍,但将该值解释为 16:17:22 是不正确的。

作为一个带有两个发明时间戳的快速演示:

with archivo (no, datetime) as (
  select 256, timestamp '2015-08-14 11:37:16' from dual
  union all select 256, timestamp '2015-08-13 03:28:35' from dual
)
select ARC.NO, MIN(ARC.DATETIME) AS MIN_DATETIME, MAX(ARC.DATETIME) AS MAX_DATETIME,
  MAX(ARC.DATETIME)-MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
from archivo ARC GROUP BY ARC.NO;

        NO MIN_DATETIME          MAX_DATETIME          HORAS_TRABAJADAS
---------- --------------------- --------------------- -----------------------------
       256 2015-08-13 03:28:35.0 2015-08-14 11:37:16.0 +000000001 08:08:41.000000000

如果您想以不同的格式显示间隔,则需要提取其组件,例如:

select NO,
  EXTRACT(day FROM HORAS_TRABAJADAS) || ' days, '
    || EXTRACT(hour FROM HORAS_TRABAJADAS) || ' hours, '
    || EXTRACT(minute FROM HORAS_TRABAJADAS) || ' minutes and '
    || EXTRACT(second FROM HORAS_TRABAJADAS) || ' seconds'
    AS HORAS_TRABAJADAS
from (
  select ARC.NO, MAX(ARC.DATETIME)-MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
  from archivo ARC GROUP BY ARC.NO
)

        NO HORAS_TRABAJADAS
---------- --------------------------------------------------
       256 1 day, 8 hours, 8 minutes and 41 seconds

我使用内联视图来避免重复最大-最小值计算,但这是可选的。

或者将天数添加为 24 小时的倍数:

select NO,
  24 * EXTRACT(day FROM HORAS_TRABAJADAS) + EXTRACT(hour FROM HORAS_TRABAJADAS)
    || ':' || LPAD(EXTRACT(minute FROM HORAS_TRABAJADAS), 2, '0')
    || ':' || LPAD(EXTRACT(second FROM HORAS_TRABAJADAS), 2, '0')
    AS HORAS_TRABAJADAS
from (
  select ARC.NO, MAX(ARC.DATETIME)-MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
  from archivo ARC GROUP BY ARC.NO
);

        NO HORAS_TRABAJADAS
---------- ----------------
       256 32:08:41

不幸的是,没有一个简单的to_char() 等价于间隔。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多