我在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的事情(我认为)。
答案 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的回答;这确实在某些方面帮助了我。