14

我在数据库中有日期和时间字段。我想通过连接日期和时间来获得时间戳。如何在 PostgreSQL 中做到这一点?

我已经这样做了:

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2011-05-17 10:40:28');

它工作正常。

但是当我尝试替换日期和时间字段时,我收到以下错误:

SELECT EXTRACT(EPOCH FROM TIMESTAMP Day || ' ' || Time);
ERROR:  syntax error at or near "Day"
LINE 1: ...quest_count > 0 AND (EXTRACT(EPOCH FROM TIMESTAMP Day || ' ' || Time)) > (e...
4

3 回答 3

23

datetime类型

如果您的Dayis 属于 typedate并且您的Timeis of type time,则有一个非常简单的解决方案:

SELECT EXTRACT(EPOCH FROM (day + time));

您可以添加datetime获取一个timestamp [without time zone](根据会话的时区设置进行解释)。

而且,严格来说,提取时代与您的问题本身无关。
date+time结果是 a timestamp,就是这样。

字符串类型

如果您在谈论字符串文字或text/varchar列,请使用:

SELECT EXTRACT(EPOCH FROM ('2013-07-18' || ' ' || '21:52:12')::timestamp);

或者

SELECT EXTRACT(EPOCH FROM cast('2013-07-18' ||' '|| '21:52:12' AS timestamp));

你的表格不起作用

SELECT EXTRACT(EPOCH FROM TIMESTAMP ('2013-07-18' || ' ' || '21:52:12'));

这会起作用:

SELECT EXTRACT(EPOCH FROM "timestamp" ('2013-07-18' || ' ' || '21:52:12'));

我引用了关于类型转换的手册

也可以使用类似函数的语法来指定类型转换:

typename ( expression )

但是,这仅适用于名称也可以作为函数名称的类型。例如,double precision不能这样使用,但是等价的float8可以。此外,由于语法冲突,名称intervaltimetimestamp只能在双引号中以这种方式使用。因此,使用类似函数的强制转换语法会导致不一致,应该避免使用。

大胆强调我的。
它的要点:宁可使用前两个语法变体之一。

于 2013-07-18T19:50:52.473 回答
17
SELECT EXTRACT(EPOCH FROM (Day || ' ' || Time)::timestamp);
于 2013-07-18T14:13:18.307 回答
2

这对我来说很好:

SELECT CONCAT(Day,' ',Time)::timestamp;
于 2019-09-04T09:00:28.730 回答