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