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 的回答;这确实在某些方面帮助了我。
我在 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 的回答;这确实在某些方面帮助了我。