如何使用用户指定的时间和时区运行常规任务?

时间:2019-07-11 04:51:55

标签: postgresql

需要为我的每个用户运行一个常规作业,但是我希望在他们不在时运行它。由于他们可能会在午夜开门,所以我希望他们能够指定时间以及他们的时区。

在为给定用户运行作业之后,我想在他们的时区中预先计算下一次出现的时间并将其存储起来,以使其更易于查询(尽管我不确定这是最好的方法)

到目前为止,我已经弄清楚了以下内容:

  • 由于日期和时间类型都不存储时区,因此我需要一个单独的时区字段
  • 我需要存储没有时区的时间,以便在进行操作时不会被转换
  • 我(大概)不能使用间隔时间,因为这些间隔时间无法解决夏时制

我发现在AT TIME ZONE上使用TIMESTAMP WITHOUT TIME ZONE可以计算该时间发生的本地时间的绝对时间,但是我还没有弄清楚如何在用户的本地时间添加时间偏好。

到目前为止,我有这个: SELECT (TIMESTAMP 'tomorrow' AT TIME ZONE timezone) my_table

,我想要这样的东西: UPDATE my_table SET next_day_start_timestamptz=((TIMESTAMP 'tomorrow' + day_start_time) AT TIME ZONE timezone) WHERE id=1,但我不断收到类型错误。

我该如何做?

1 个答案:

答案 0 :(得分:1)

这取决于day_start_time的数据类型是什么以及如何存储。

如果它是文本类型,适当的整数或整数类型(例如09或9),则可以简单地

select ((TIMESTAMP 'tomorrow'
   + INTERVAL '1 hour' * day_start_time::int) 
 AT TIME ZONE day_start_time ) FROM my_table;

如果它是代表开始时间的时间数据类型,则可以简单地添加它

select ((TIMESTAMP 'tomorrow'
       + day_start_time ) AT TIME ZONE day_start_time ) FROM t

DEMO