从 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。
以下查询选择一个 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。