如何在Postgresql中查询(SELECT),使日期不同的列的结果在当前周的周日到周六之间。
查询伪例:
SELECT * FROM table WHERE datecolumn BETWEEN CURRENT WEEK
在另一个查询中,我得到了一年中的第几周。如何选择这些日期,并在WHERE子句中应用特定年份中的特定周数。
查询伪例:
SELECT * FROM table WHERE datecolumn BETWEEN WEEK15 FROM year 2020
发布于 2020-01-19 23:45:14
也许你可以使用这样的东西:
SELECT *
FROM table
WHERE
EXTRACT(week FROM datecolumn) = EXTRACT(week FROM NOW())
AND
EXTRACT(isoyear FROM datecolumn) = EXTRACT(isoyear FROM NOW())
week
是ISO-8601周数。根据定义,ISO周从星期一开始,一年的第一周包含该年的1月4日。换句话说,一年的第一个星期四在那一年的第一周。
在ISO周编号系统中,1月初的日期可以是前一年的52周或53周的一部分,而12月下旬的日期可以是下一年的第一周的一部分。
例如,2005-01-01是2004年53周的一部分,2006-01-01是2005年52周的一部分,而2012-12-31是2013年第一周的一部分。
为了获得一致的结果,建议将isoyear
字段与week
字段一起使用。
如果您需要自定义(非ISO)周编号-您将不得不手工计算。
发布于 2020-01-19 23:56:19
我会推荐以下两个条件:
where
date_column >= current_date - extract(dow from current_date) * interval '1 day'
and date_column < current_date - (extract(dow from current_date) - 8) * interval '1 day'
Postgres的date_trunc(week, ...)
在周一开始,所以我们需要一些更复杂的东西,使用extract(dow from ...)
,它在周日返回0
。
这种方法的优点是它是SARGeable的,因为没有函数应用于被过滤的列。这意味着这将很好地利用date列上的索引。
发布于 2020-01-19 23:59:10
我会使用date_trunc()
,但就像这样。对于当前一周:
where datecolumn >= date_trunc('week', now()) and
datecolumn < date_trunc('week', now()) + interval '1 week'
对于一年中的第n周,这就更棘手了。我认为这就是你想要的:
where datecolumn >= (date_trunc('week', now()) -
(extract(week from now()) - 1) * interval '1 week' +
<n> * interval '1 week'
) and
datecolumn < (date_trunc('week', now()) -
(extract(week from now()) - 1) * interval '1 week' +
(<n> + 1) * interval '1 week'
)
这两种方法都是结构化的,因此计算不在列上,因此它们与使用索引兼容。
https://stackoverflow.com/questions/59811558
复制相似问题