这应该很简单,但是我遇到了令人尴尬的麻烦。
在 PostgreSQL 9.1 中,我需要解释一个DATE
在数据库中存储为 a 的字段,就好像它是TIMESTAMPTZ
那个日期的午夜 UTC 一样。我想以一种清晰易读的方式来完成它,以便有人可以出现、查看并理解正在发生的事情。
到目前为止,我发现的唯一方法都非常难看。将其转换为 a然后通过将其解释为 UTC来TIMESTAMP WITHOUT TIME ZONE
创建 a :TIMESTAMP WITH TIME ZONE
SELECT CAST(DATE '2012-01-01' AS TIMESTAMP WITHOUT TIME ZONE) AT TIME ZONE 'utc'
另一种方式更糟糕:
('2012-01-01'::date)::timestamptz - (current_timestamp AT TIME ZONE 'UTC' - current_timestamp)
因为它将日期转换为当地时间午夜的时间戳,然后减去时区偏移量。我找不到任何方法将偏移量作为本地时间间隔(这似乎很疯狂),所以我通过current_timestamp
在当地时间与current_timestamp
UTC 进行比较来获得它。
我可以解决的唯一其他方法extract
是获取日期零件并timestamptz
从中组装新零件。我什至不会展示那个,它太丑了。
这两种方法都让人感到各种奇怪和错误。是否有任何理智的方式 - 标准或否 - 以可读且易于理解的方式从该日期的午夜 UTC转换DATE
为 a ?timestamptz
我正在寻找类似的东西(想象的,行不通)
'2012-01-01'::date AS TIMESTAMPTZ IN TIME ZONE '00:00';
或者
to_timestamp('2012-01-01'::date, '00:00'::time, 'UTC');
请指出我错过的愚蠢明显的事情。
请注意,我正在测试以确保日期在内部真正正确,而不仅仅是在显示时,转换日期extract(epoch from $1)
在哪里。$1