【问题标题】:Get a timestamp from concatenating day and time columns从连接日期和时间列中获取时间戳
【发布时间】:2013-07-17 12:27:20
【问题描述】:

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

【问题讨论】:

  • 您忘记提供确切的数据类型。

标签: postgresql datetime casting concatenation postgresql-9.1


【解决方案1】:

datetime 类型

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

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

您只需添加datetime 即可获得timestamp [without time zone](根据会话的时区设置进行解释)。

而且,严格来说,提取纪元与您的问题本身无关。
date + time 导致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));

您的表单不起作用

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

这可行:

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

我引用the manual about type casts:

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

typename ( expression )

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

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

【讨论】:

    【解决方案2】:
    SELECT EXTRACT(EPOCH FROM (Day || ' ' || Time)::timestamp);
    

    【讨论】:

    • 很好的答案,只是想建议用to_timestamp 将其包装成时间戳格式(目前它正在向我返回纪元时间)
    【解决方案3】:

    这对我来说很好用:

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

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2017-12-01
      • 1970-01-01
      • 2023-03-22
      • 2012-04-15
      • 2017-02-01
      • 2011-02-20
      相关资源
      最近更新 更多