如何用SQL查询上周六和之前的周六?

Zel*_*elB 1 sql datetime sql-date-functions sqldatetime amazon-redshift

我想查询一些工作日之间的数据,如下:

  1. 上个星期六
  2. 之前的周日
  3. 之前的星期六于 2 日向星期日询问。
  4. 之前的周日于 3 号周六进行了查询。

该查询将在每周一自动运行,因此我想为其设置一个动态条件,以便它自动选择那一天,而不依赖于将来运行的任何一天。

例如,如果今天是 2018 年 1 月 8 日星期一:

  1. 将是 01/06/2018
  2. 将是 12/31/2017
  3. 将是 12/30/2017
  4. 将是 12/24/2017

我想在 WHERE 子句中设置该条件。现在我以这种方式查询它,使用恒定的日期,例如上周的数据:

SELECT *
FROM thisTable
WHERE Date(operation_date) BETWEEN '2018-06-10' AND '2018-06-16'
Run Code Online (Sandbox Code Playgroud)

数据库管理系统:亚马逊红移

Joh*_*ein 6

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
Run Code Online (Sandbox Code Playgroud)

返回:

2018-06-21 | 2018-06-18 00:00:00 | 2018-06-16 00:00:00 | 2018-06-10 00:00:00
Run Code Online (Sandbox Code Playgroud)

请注意,它将日期视为当天开始时的午夜。所以,你真的不想查询周日到周六。您实际上想要查询周日到周日(这实际上意味着周日开始的午夜到下周日开始的午夜)。这假设您的源日期是时间戳

如果您的源日期只是一个日期,那么您可能需要使用星期日到星期六

如果您想查询“上周”中的所有内容(如果您的定义是周日到周日),并假设有时间戳,请使用:

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
Run Code Online (Sandbox Code Playgroud)

(好吧,除非你已经是周日了,但那是你的问题!)

如果日期是date,则必须稍微调整一下。