【问题标题】:Getting a weird result for ISO Date in Postgresql在 Postgresql 中获取 ISO 日期的奇怪结果
【发布时间】:2016-05-24 10:25:01
【问题描述】:

我有一张表 task_details。我需要从此表中选择它的每周日期。我已使用 ISO YearISO Week 从该表中提取每周日期,因为我想将其周数提取为 53,如果它是 2015 年 12 月,然后是第 28 天Dec,29 Dec,30 Dec,31 Dec 和 1 Jan '16,2 Jan '16 因为对于这些日期,它不应该分开两个不同的星期。
我用于ISO Year & ISO 周 如下。

select
    name, id,
    to_date(week || ' ' || yr, 'IW IYYY') week_date,
    sum(worked_hours) worked_hours_per_week,
    week, yr
from (
    select
        name, id,
        newdate, hours worked_hours,
        to_number(to_char(newdate, 'IW'), '99') week,
        extract( year from newdate) yr
    from task_details t
) sub
where worked_hours > 0 
group by name, id, to_date(week || ' ' || yr, 'IW IYYY'), week, yr 
order by yr, week

这几周工作正常,但后来我得到了一个奇怪的结果,用于表中的记录。
该表没有 2017 年的数据。另外, yr 列显示 2016 年,这是所期望的,但是 newdate 列和 week 列给出了奇怪的结果。为什么会这样?我该如何解决这个问题?

这是它的 SQL 小提琴:http://sqlfiddle.com/#!15/53abf/1

【问题讨论】:

  • 非常有创意的格式。您可能对这个小帮助页面感兴趣:stackoverflow.com/editing-help。更新格式时,请记住包含您的 Postgres 版本和正确的表定义。

标签: postgresql date sum dayofweek isodate


【解决方案1】:

您不应在提取函数中将weekyear 混合使用,因为year 用于公历而不是特殊的ISO 日历。

section 9.9.1 and comments about week

to_number(to_char(newdate, 'IW'), '99') 实际上是extract(week from newdate)

yr 列更改为extract(isoyear from newdate) 可以解决您的问题。

Adjusted SQL Fiddle

【讨论】:

    【解决方案2】:

    @gwaigh 已经解决了您对公历和 ISO 年份的困惑。

    但是,使用date_trunc() 获取每周的第一天,您的查询会更简单、更快捷:

    SELECT name, id
         , date_trunc('week', newdate)::date AS week_date
         , extract(week FROM newdate)::int       AS week
         , extract(isoyear from newdate)::int    AS isoyr  -- must be ISO year to match
         , sum(hours)                            AS worked_hours_per_week
    FROM   task_details
    WHERE  hours > 0
    GROUP  BY name, id, week_date, week, yr
    ORDER  BY week_date;

    还简化了您的查询。

    SQL Fiddle.

    无论哪种方式,如果您使用timestamptz,那么年、周或日期取决于您当前的时区设置。 (可能是不同的年份,具体取决于您现在所在的位置。)

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2012-04-27
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多