我想查询一些工作日之间的数据,如下:
查询将在每周一自动运行,所以我想为其设置一个动态条件,以便它自动选择那一天,而不依赖于将来运行的任何一天。
例如,如果今天是星期一 01/08/2018:
我想在 WHERE 子句中设置该条件。现在我以这种方式查询它,使用恒定的日期,例如上周的数据:
SELECT *
FROM thisTable
WHERE Date(operation_date) BETWEEN '2018-06-10' AND '2018-06-16'
数据库管理系统:Amazon Redshift
DATE_TRUNC 函数是你的朋友。它被截断为星期一。
SELECT
CURRENT_DATE AS today,
DATE_TRUNC('week', CURRENT_DATE) as most_recent_monday,
DATE_TRUNC('week', CURRENT_DATE) - 2 AS most_recent_saturday,
DATE_TRUNC('week', CURRENT_DATE) - 8 AS sunday_before_most_recent_saturday
退货:
2018-06-21 | 2018-06-18 00:00:00 | 2018-06-16 00:00:00 | 2018-06-10 00:00:00
请注意,它将日期视为午夜一天的开始。所以,你真的不想查询周日到周六。您实际上想要查询Sunday to Sunday(这实际上意味着周日开始的午夜到下周日开始的午夜)。这假设您的源日期是时间戳。
如果您的源日期纯粹是日期,那么您需要使用周日到周六。
如果您想查询“上周”中的所有内容(如果您的定义是周日到周日),并假设时间戳,请使用:
SELECT *
FROM thisTable
WHERE operation_date BETWEEN
-- Most recent Monday minus 8 days = Two Sundays ago
DATE_TRUNC('week', CURRENT_DATE) - 8 AND
-- Most recent Monday minus 1 day = Most recent Sunday
DATE_TRUNC('week', CURRENT_DATE) - 1
(好吧,除非你已经是周日了,但那是你的问题!)
如果日期是日期,则需要稍微调整一下。
最后一个星期六:
date_trunc('week',getdate())-interval '2 day'
上周六:
date_trunc('week',getdate())-interval '9 day'
这是基于周一的一周
如果当天是星期六,其他答案将不会返回正确的值。它们还可能受到集群上区域设置的影响,导致一周的第一天不同,因此
date_trunc
返回不同的一天。
可重复、准确的方法是使用
next_day
:
SELECT NEXT_DAY(CURRENT_DATE - INTERVAL '7 days', 'Saturday') as most_recent_saturday
/* subtract 7 as NEXT_DAY() always returns the next Saturday, even if today is Saturday */
, NEXT_DAY(CURRENT_DATE - INTERVAL '14 days', 'Saturday') as last_saturday