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

SQL: Add UTC timestamp column to table from date and time

我在 Postgres 中有一个 table,它有日期列和时间列。我想添加一个新列,该列具有基于日期和时间列的 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(我认为)的事情。

你想做什么

添加一个新的,您需要一个alter table语句:

alter table mytable add column utc float;

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

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

您现在需要一个触发器来保持 date/time 和 utc 列同步。

你应该做什么

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

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

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

您应该有一个类型为 timestamp 的列,然后创建一个 returns 和 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;

这样您就不需要复制存储在 table 中的信息只是因为您需要不同的显示格式。

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

我提到所需的格式是 ddddd.tttttt,其中 d 是日期的数字版本(特别是自 1900-01-00 以来的天数),t是 24 小时的一小部分。这是 Excel 用于存储日期时间值的格式,称为 "serial date-time." 有关详细信息,请参阅 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 的回答;这确实在某些方面帮助了我。