我正在尝试执行以下操作:
我有一个TIME
列,其中存储没有偏移的时间。我还将时区列存储为字符串,格式为“美国/芝加哥”。
这里的想法是,我可以使用时间列并做(time_col AT TIME ZONE timezone
)并将其与CURRENT_TIME
进行比较,以确定它是否大于或小于确定是否应该触发某件事还是不在后端。
我无法将时间与时区存储在一起,因为这会处理某些事情开始时的情况,并且如果发生夏时制,它仍然会同时开始。如果发生DT / ST切换,则以时区偏移量存储将导致其关闭一个小时。例如从美国/芝加哥的下午5:00开始。当夏令时发生时,如果与时区一起存储,则现在是美国/芝加哥的下午6:00,但不应如此。即使使用时间切换,它仍然应该是5:00 PM。因此,动态增加偏移量可以防止这种情况。
但是,以下内容似乎根本没有增加时间偏移量:
SELECT time_col AS start_orig, (time_col AT TIME ZONE timezone) AS start_new, CURRENT_TIME as now_time FROM "time_test_table"
无论时区是什么(我尝试仅添加'America / Chicago'和'utc'),时间都不会改变并且不会出现偏移。
例如:
timezone start_orig start_new now_time
--------------- ---------- --------- --------
America/Chicago 19:00:00 19:00:00 16:49:50
我认为我会变得更聪明,并切换CURRENT_TIME
的时区,以查看AT TIME ZONE
是否如文档所述运行,并且似乎没有:
SELECT CURRENT_TIME AS now_time, (CURRENT_TIME AT TIME ZONE 'utc') AS utc_time, (CURRENT_TIME AT TIME ZONE 'America/Chicago') AS ct_time FROM "time_test_table"
now_time utc_time ct_time
-------- -------- --------
16:51:28 16:51:28 16:51:28
以供参考:https://www.postgresql.org/docs/9.6/functions-datetime.html
之前有人处理过AT TIME ZONE
吗?我的误解在哪里发生?
编辑 Postgres版本9.4.6 时间栏:
TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SCOPE_CATLOG SCOPE_SCHEMA SCOPE_TABLE SOURCE_DATA_TYPE IS_AUTOINCREMENT
(null) public time_test_table time_col 92 time 15 (null) 6 10 1 (null) (null) (null) (null) 15 30 YES (null) (null) (null) (null) NO
(null) public time_test_table timezone 12 varchar 255 (null) 0 10 1 (null) (null) (null) (null) 255 8 YES (null) (null) (null) (null) NO