SQL:从日期和时间向表中添加UTC时间戳列

时间:2016-04-20 18:55:18

标签: sql postgresql utc

我在Postgres中有一个表,其中包含日期列和时间列。我想添加一个基于日期和时间列具有utc(或时间戳)值的新列。

我尝试了以下内容:

INSERT INTO mytable (utc) SELECT EXTRACT(EPOCH FROM (date || ' ' || time )::timestamp);

但我收到错误:

ERROR: column "date" does not exist
SQL state: 42703
Hint: There is a column named "date" in table "mytable", but it cannot be referenced from this part of the query.

肯定有列日期和时间。

有没有人知道如何根据日期和时间列向UTC列添加值?
例如:09/21/2012 12:56:00应该变成类似411730.830555

我尝试做类似于this question的事情(我认为)。

2 个答案:

答案 0 :(得分:3)

你想做什么

添加新的,您需要alter table声明:

alter table mytable add column utc float;

然后,您需要使用新数据更新该列:

update mytable
  set utc = EXTRACT(EPOCH FROM (date || ' ' || time )::timestamp);

现在需要一个触发器来保持日期/时间和utc列同步。

你应该做什么

以上不是一个好主意。关系数据库中的经验法则:

永远不要存储可以从数据库中已有的数据派生的信息。

因此,干净的解决方案是不将日期和时间存储在两个不同的列中,而不是添加另一个在不同表示中包含完全相同信息的列。

您应该有一个类型为timestamp的列,然后创建一个视图,返回具有您想要的不同格式的timestamp

-- add the new timestamp column
alter table mytable add column ts_column timestamp;

-- copy the data 
update mytable
  set ts_column = (date || ' ' || time )::timestamp;

-- get rid of the old columns
alter table mytable 
     drop column date, 
     drop column time;

-- now create a view that display the information in different ways              
create view formatted_mytable
as
select id, 
       ts_column, 
       to_char(ts_column, 'yyyy-mm-dd') as date_only, 
       to_char(ts_column, 'hh24:mi:ss') as time_only, 
       extract(epoch from ts_column) as epoch
from my_table;

这样您就不需要复制表中存储的信息,因为您需要不同的显示格式。

答案 1 :(得分:0)

在进一步调查后,其他答案的格式实际上与我想要的格式不同。

我提到所需的格式为ddddd.tttttt,其中d是日期的数字版本(具体来说,是自1900-01-00以来的天数),t是24小时的分数。这是Excel用于存储日期时间值的格式,称为“序列日期时间”。有关详细信息,请参阅Dates and Times in Excel.

我认为这与postgresql的时间戳格式类似,但事实证明它不适用于我的目的。

这是有用的:

UPDATE mytable SET utc = DATE_PART('day', '2012-09-21'::timestamp - '1899-12-30'::timestamp) + (EXTRACT( HOURS FROM time::time)/24) + (EXTRACT( MINUTES FROM time::time)/1440) + (EXTRACT( SECONDS FROM time::time)/86400);

只是想更新答案的准确性,以防万一其他人偶然发现这个问题。似乎关于如何在互联网上执行此操作的信息很少。我很感激@a_horse_with_no_name的回答;这确实在某些方面帮助了我。