跨时区查询

时间:2014-05-18 18:41:12

标签: postgresql datetime database-design timezone schema

我正在开发一个应用程序,用户可以在其时区每天的特定时间请求向他们发送电子邮件。例如,用户A住在伦敦,并在伦敦时间每天下午2点安排一封电子邮件,用户B住在纽约,并在纽约时间下午2点安排电子邮件。

我想知道我应该以何种方式配置我的数据库postgres,以便调度程序可以每分钟触发并查询在该分钟发送的所有电子邮件,无论他们在哪个时区。

我想避免的一件事是每个时区必须运行多个查询。

1 个答案:

答案 0 :(得分:3)

由于世界各地的夏令时(DST)(相当愚蠢,非常坦率)规则,当地时间可能意味着绝对的所有事情(UTC时间)。

保存time(不是timetz!)和时区名称(不是缩写),以便何时发送电子邮件。这个相关问题下的棘手细节:
Time zone names with identical properties yield different result when applied to timestamp

CREATE TABLE event (
   event_id serial PRIMARY KEY
 , alarm_time time  -- local alarm time
 , tz text          -- time zone name
 , ...
);

使用以下表达式" cook"确切的每日时间点,考虑当地的夏令时设置:

SELECT current_date + alarm_time AT TIME ZONE tz;

示例:

SELECT current_date + '2:30'::time AT TIME ZONE 'Europe/London' AS alarm_ts

返回:

alarm_ts
2014-05-19 02:30:00+02

在整个应用程序中使用timestamp with time zonetimestamptz)。一定要了解它是如何工作的。这篇综合文章可能会有所帮助(也解释了AT TIME ZONE结构:
Ignoring timezones altogether in Rails and PostgreSQL

要清楚,一旦你做了#34;煮熟的"每日UTC时间,您也可以将其翻译成当地时间并与之合作。但在UTC中完成所有其他工作可能不那么令人困惑。