Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Postgresql中获得ISO日期的奇怪结果_Postgresql_Date_Sum_Dayofweek_Isodate - Fatal编程技术网

在Postgresql中获得ISO日期的奇怪结果

在Postgresql中获得ISO日期的奇怪结果,postgresql,date,sum,dayofweek,isodate,Postgresql,Date,Sum,Dayofweek,Isodate,我有一个表格任务的详细信息。我需要从这个表中选择它的每周日期。我已使用ISO年和ISO周从该表中提取每周日期,因为我想将其周数提取为53,如果是2015年12月,则为12月28日、12月29日、12月30日、12月31日和16年1月1日、16年1月2日,因为这类日期不应分为两周。我对ISO年和ISO周使用的查询如下所示 select name, id, to_date(week || ' ' || yr, 'IW IYYY') week_date, sum(worked_

我有一个表格任务的详细信息。我需要从这个表中选择它的每周日期。我已使用ISO年和ISO周从该表中提取每周日期,因为我想将其周数提取为53,如果是2015年12月,则为12月28日、12月29日、12月30日、12月31日和16年1月1日、16年1月2日,因为这类日期不应分为两周。我对ISO年和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注释:

在提取函数中不应将周与年混合在一起,因为年是用于公历的,而不是特殊的ISO日历

从newdate开始的一周内有效提取'IW','99'

将yr列更改为extractisoyear from newdate可以解决您的问题

您不应该在提取功能中混合使用周和年,因为年是公历,而不是特殊的ISO日历

从newdate开始的一周内有效提取'IW','99'

将yr列更改为extractisoyear from newdate可以解决您的问题

已经消除了你对公历和ISO年的混淆

但是,如果要获得每周的第一天,您的查询将更简单、更快:

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;
还简化了您的查询

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

已经消除了你对公历年和ISO年的混淆

但是,如果要获得每周的第一天,您的查询将更简单、更快:

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;
还简化了您的查询


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

非常有创意的形式。您可能对此小帮助程序页感兴趣:。在更新格式时,请记住包含您的Postgres版本和适当的表定义。非常有创意的格式。您可能对此小帮助程序页感兴趣:。更新格式时,请记住包含您的Postgres版本和正确的表定义。