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

问题描述 投票:0回答:3

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

  1. 上周六
  2. 之前的周日
  3. 之前的星期六于 2 日询问星期日。
  4. 之前的周日在 3 号周六查询。

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

例如,如果今天是星期一 01/08/2018:

  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'

数据库管理系统:Amazon Redshift

sql datetime amazon-redshift sql-date-functions sqldatetime
3个回答
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

退货:

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

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

如果日期是日期,则需要稍微调整一下。


0
投票

最后一个星期六:

date_trunc('week',getdate())-interval '2 day'

上周六:

date_trunc('week',getdate())-interval '9 day'

这是基于周一的一周


0
投票

如果当天是星期六,其他答案将不会返回正确的值。它们还可能受到集群上区域设置的影响,导致一周的第一天不同,因此

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
© www.soinside.com 2019 - 2024. All rights reserved.