SQL - 从中​​提取时间和偏移量

时间:2010-10-25 13:33:05

标签: sql oracle

如果我在表格中有一个DateTime字段。如何从行中提取时间,然后返回偏移值。

例如,我想抵制午夜。所以,如果时间是00:45,我想要值45.如果时间是23:30我想要值-30。

感谢。

3 个答案:

答案 0 :(得分:5)

尝试:

(datecol - round(datecol))*24*60

例如:

with times as
( select trunc(sysdate) t from dual
  union
  select trunc(sysdate)+0.25 t from dual
  union
  select trunc(sysdate)+0.5 t from dual
  union
  select trunc(sysdate)+0.75 t from dual
)
select (t-round(t))*24*60 from times;

0
360
-720
-360

请注意,午夜在午夜之前被视为720分钟

答案 1 :(得分:0)

可在此处找到Oracle支持的日期时间格式列表:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm

您可以将这些格式与to_char函数一起使用 - 例如:

select to_char(sysdate, 'mi') from dual

您似乎选择了一种表示不受支持的时间的方式,但Tony的答案应该符合您的要求。

答案 2 :(得分:0)

好的。假设时间是午夜前12到23小时,午夜后0到11小时,换句话说就像@Tony安德鲁斯说的那样,午间被视为午夜前720分钟

这是另一种解决方案 -

SELECT (
  CASE
    WHEN TO_CHAR(datetimefield,'HH24') BETWEEN 12 AND 23
    THEN -1 * (60 * (12 - TO_CHAR(datetimefield,'HH')) - TO_CHAR(datetimefield,'MI'))
    WHEN TO_CHAR(datetimefield,'HH24') BETWEEN 0 AND 11
    THEN 60 * (TO_CHAR(datetimefield,'HH')) + TO_CHAR(datetimefield,'MI')
  END) diff
FROM (select systimestamp datetimefield from dual);

我使用系统时间戳进行测试,您需要替换查询select systimestamp datetimefield from dual以从表中获取自己的日期时间字段,以使其适合您。