从 Unix 时间戳中减去小时数

Subtracting hours from Unix Timestamp

以下查询选择一个 unix 时间戳。应该是下午 1 点,但因为 UTC 而说是下午 5 点。它需要是东部时间下午 1 点,所以我需要从中减去 4 小时。解决此问题的最佳方法是什么?

SELECT CAST(to_date('1970-01-01', 'YYYY-MM-DD') + substr(STARTTIME,0,10)/60/60/24 as timestamp)

您不应该手动计算。您应该添加或减去时区。

这是一个示例查询:

SELECT TO_CHAR (
           FROM_TZ (CAST (SYSDATE AS TIMESTAMP), 'UTC')
               AT TIME ZONE 'EUROPE/BERLIN',
           'YYYY-MM-DD HH24:MI:SS TZH:TZM TZR')
           AS BERLIN_Time_complete,
           TO_CHAR (
           FROM_TZ (CAST (SYSDATE AS TIMESTAMP), 'UTC')
               AT TIME ZONE 'UTC',
           'YYYY-MM-DD HH24:MI:SS TZH:TZM TZR')
           AS UTC_Complete,
           TO_CHAR (
           FROM_TZ (CAST (SYSDATE AS TIMESTAMP), 'UTC')
               AT TIME ZONE 'EUROPE/BERLIN',
           'YYYY-MM-DD HH24:MI:SS TZH:TZM')
           AS BERLIN_Time_complete,
           TO_CHAR (
           FROM_TZ (CAST (SYSDATE AS TIMESTAMP), 'UTC')
               AT TIME ZONE 'EUROPE/BERLIN',
           'TZH:TZM')
           AS BERLIN_Timezone,
           TO_CHAR (
           FROM_TZ (CAST (SYSDATE AS TIMESTAMP), 'UTC')
               AT TIME ZONE 'EUROPE/BERLIN',
           'TZR')
           AS Timezone_Name
  FROM DUAL;

关键是格式:

  • YYYY:四位数年份(0000-9999 例如:2018)
  • MM: 两位数的月份(01-12)
  • DD: 两位数的日期 (01-31)
  • HH24:00-23 小时
  • MI:00-59 分钟
  • SS:秒数 00-59
  • TZH:时区-小时
  • TZM: Timezone-Minutes (有些时区有 30 分钟偏移)
  • TZR:时区名称

你应该尝试一下这些,以了解 to_date()/to_char()。你会需要它。

如果你真的想增加时间。举个例子:

select sysdate + INTERVAL '2' HOUR from dual;

你可以试试这个:

SELECT TO_CHAR(sysdate, 'DD-MON-YYYY HH24:MI:SS') AS myDate
FROM   dual;

有关详细信息,请阅读 this document