从连接日期和时间列获取时间戳

15

我在数据库中有日期字段和时间字段。我想通过连接日期和时间来获取时间戳。如何在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...
3个回答

26

标识符?

不清楚您是否在标识符中使用了大写字母,这需要用双引号括起来。

此外,Day是SQL中的保留字,尽管在Postgres中允许其作为标识符,但可能需要特殊处理。一般建议避免使用保留字和基本类型名称。无论如何,双引号能解决问题。我的建议是使用合法的小写标识符,永远不需要用双引号。详情请见:

datetime类型

如果您的列"Day"date类型,而您的列"Time"time类型,则有一个非常简单的解决方案:

SELECT EXTRACT(EPOCH FROM ("Day" + "Time"));

你只需要添加类型日期时间,就可以得到一个timestamp [没有时区]。提取纪元与你的问题本身无关。日期+时间得到一个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加上双引号,才能以这种方式使用,因为存在语法冲突。因此,使用类似函数的转换语法会导致不一致性,应该尽量避免。

强调部分为本人添加。
请使用前两种语法变体中的任意一种。


17
SELECT EXTRACT(EPOCH FROM (Day || ' ' || Time)::timestamp);

1
非常好的答案,我只想建议将其包装在 to_timestamp 中,这将使其以时间戳格式呈现(目前它正在返回纪元时间)。 - Djones4822

5
这对我来说很有效:

SELECT CONCAT(Day,' ',Time)::timestamp;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接