PostgreSQL:选择在一周的特定日期,特定时区发生的行

亚历克斯·吉库列斯库(Alex Ghiculescu)

我有一个存储“快照”数据的表-每10分钟捕获一次工作人员的人数并将其存储在其中。我想生成一个报告,以显示特定工作日(一天的最后四个星期天)一天的工作量。

在Rails中,我的查询如下所示:

<model>.where("EXTRACT(dow FROM (time + interval '#{time_zone_offset} hours')) = ?", Time.zone.now.wday)
       .where('time BETWEEN ? AND ?', 5.weeks.ago.end_of_week, 1.week.ago.end_of_week)
       .select("organisation_id, date_trunc('hour', time) as grouped_time, avg(staff) as staff")
       .group("grouped_time").order("grouped_time")

并转换为以下SQL:

SELECT date_trunc('hour', time) as grouped_time, avg(staff) as staff
FROM <model>
WHERE (EXTRACT(dow FROM (time + interval '10 hours')) = 0)
AND (time BETWEEN '2013-09-22 13:59:59.999999' AND '2013-10-20 13:59:59.999999')
GROUP BY grouped_time
ORDER BY grouped_time

在这种情况下,time_zone_offset根据我要查找的用户而有所不同:

def time_zone_offset
  @tzoffset ||= ActiveSupport::TimeZone[current_user.organisation.time_zone].utc_offset / 60 / 60
end

(当前时区也设置在around_filter中,以便1.week.ago等时区位于正确的时区。)

我的数据库的时区为UTC(set TIME ZONE 'UTC')。

这行得通,但是我敢肯定,有一种更好的方法可以在一周的特定日期查找记录,然后interval通过手动操作来查找记录我也认为这不适用于适用的时区的DST。我知道PostgreSQL可以将a转换time with time zone为特定的时区,但是其中不包含日期,所以我不知道星期几!我尝试过的其他WHERE子句:

  • EXTRACT (dow from time') = 0 -这为我提供了周日上午10点至星期一上午10点之间的快照

  • EXTRACT (dow from time at time zone 'Brisbane/Australia') = 0-这使我可以在周日晚上8点到周一晚上8点之间进行操作。我的理解是,发生这种情况是因为Postgres视该time字段为布里斯班时间,而不是其从UTC转换为布里斯班时间。

因此,我很想知道是否应该做些什么才能使此查询正常工作。

丹尼尔·特鲁斯(Daniel Truth)

AT TIME ZONE当应用于a时timestamp without timezone会产生一个timestamp with timezone(反之亦然)。timestamp with timezone将在您会话的时区(在您的情况下为UTC)中进行解释。

因此,该表达式EXTRACT (dow from time at time zone 'Brisbane/Australia')不会在time(UTC)的布里斯班提取日期,而是time从实际上居住在UTC时区的某人的角度提取与转换后的日期相对应的日期

例如,当我键入此内容时,如果假装为UTC:

=>将时区设置为“ UTC”;
=>在“澳大利亚/布里斯班”时区选择now(),now();
             现在| 时区          
------------------------------ + ------------------ --------- 
 2013-10-27 18:01:03.15286 + 00 | 2013-10-28 04:01:03.15286

好的,今天是UTC的星期日18:01,布里斯班的星期一04:01

但是如果将时区位移应用于timestamp without timezone

选择时区'Australia / Brisbane'的now(),now():: timestamp; 
              现在| 时区            
------------------------------- + ----------------- -------------- 
 2013-10-27 18:01:57.878541 + 00 | 2013-10-27 08:01:57.878541 + 00

请注意第二列与上一结果有何不同。实际上,它与布里斯班以UTC表示的时间相距20小时:大概是对没有太大意义的问题的技术上正确的答案。

大概您想要这样:

EXTRACT (dow from (time AT TIME ZONE 'UTC') at time zone 'Brisbane/Australia')=0

哪个应该回答:time以UTC度量的日期和时间是否对应于布里斯班的星期日?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PostgreSQL:选择在一周的特定日期,特定时区发生的行

来自分类Dev

从特定日期提前一周

来自分类Dev

从一周的特定日期中选择data.frame行

来自分类Dev

如何涂黑一周中的特定日期(日期选择器)[VB]

来自分类Dev

如何涂黑一周中的特定日期(日期选择器)[VB]

来自分类Dev

Mysql 列出日期范围之间的日期,但仅在一周中的特定日期

来自分类Dev

Google Bigquery,在特定时区的一周的开始和结束

来自分类Dev

在日期时间强制执行一周中的特定日期

来自分类Dev

检查一周的日期是否位于两个特定日期之间 SQL ORACLE

来自分类Dev

在一周的特定日期在模型级别验证Django DateField的最佳实践是什么?

来自分类Dev

Cron表达,不包括一周中的特定日期

来自分类Dev

Cron Job仅在一周的特定日期运行几天

来自分类Dev

如何检查Powershell脚本是否应在一周的特定日期运行

来自分类Dev

Cron表达式,不包括一周中的特定日期

来自分类Dev

SQL:查找一周中特定日期雇用的所有员工

来自分类Dev

Cron Job仅在一周的特定日期运行几天

来自分类Dev

MomentJS - 将月份至今添加到一周中的特定日期

来自分类Dev

Rails group_by_day 使用一周中的特定日期“星期五”

来自分类Dev

如何删除除一周中特定日期创建的文件之外的所有文件?

来自分类Dev

匹配某个时间间隔内的一周中的天数以创建特定日期

来自分类Dev

我想在一周中的特定日期发送通知

来自分类Dev

我怎么知道某个特定日期是父日期是一个月还是一周?

来自分类Dev

根据一周中的特定日期(MTWTFSS)构建掩码,以仅通过基本运算符查找特定日期是否匹配

来自分类Dev

如何在一周中的特定日期的不同时间快速实施多个本地通知

来自分类Dev

选择具有特定日期的行

来自分类Dev

在Rails的特定时区中的特定日期获得午夜的最佳方法

来自分类Dev

绘制一周内发生的日期

来自分类Dev

如何在每周模式下在 Vuetify v-calendar 中显示没有特定日期的一周中的天数?

来自分类Dev

UILocalNofication在一周的特定时间触发,除了1天

Related 相关文章

  1. 1

    PostgreSQL:选择在一周的特定日期,特定时区发生的行

  2. 2

    从特定日期提前一周

  3. 3

    从一周的特定日期中选择data.frame行

  4. 4

    如何涂黑一周中的特定日期(日期选择器)[VB]

  5. 5

    如何涂黑一周中的特定日期(日期选择器)[VB]

  6. 6

    Mysql 列出日期范围之间的日期,但仅在一周中的特定日期

  7. 7

    Google Bigquery,在特定时区的一周的开始和结束

  8. 8

    在日期时间强制执行一周中的特定日期

  9. 9

    检查一周的日期是否位于两个特定日期之间 SQL ORACLE

  10. 10

    在一周的特定日期在模型级别验证Django DateField的最佳实践是什么?

  11. 11

    Cron表达,不包括一周中的特定日期

  12. 12

    Cron Job仅在一周的特定日期运行几天

  13. 13

    如何检查Powershell脚本是否应在一周的特定日期运行

  14. 14

    Cron表达式,不包括一周中的特定日期

  15. 15

    SQL:查找一周中特定日期雇用的所有员工

  16. 16

    Cron Job仅在一周的特定日期运行几天

  17. 17

    MomentJS - 将月份至今添加到一周中的特定日期

  18. 18

    Rails group_by_day 使用一周中的特定日期“星期五”

  19. 19

    如何删除除一周中特定日期创建的文件之外的所有文件?

  20. 20

    匹配某个时间间隔内的一周中的天数以创建特定日期

  21. 21

    我想在一周中的特定日期发送通知

  22. 22

    我怎么知道某个特定日期是父日期是一个月还是一周?

  23. 23

    根据一周中的特定日期(MTWTFSS)构建掩码,以仅通过基本运算符查找特定日期是否匹配

  24. 24

    如何在一周中的特定日期的不同时间快速实施多个本地通知

  25. 25

    选择具有特定日期的行

  26. 26

    在Rails的特定时区中的特定日期获得午夜的最佳方法

  27. 27

    绘制一周内发生的日期

  28. 28

    如何在每周模式下在 Vuetify v-calendar 中显示没有特定日期的一周中的天数?

  29. 29

    UILocalNofication在一周的特定时间触发,除了1天

热门标签

归档