如何在SQL中查询上星期六和之前的那个?

时间:2018-06-21 08:22:45

标签: sql datetime amazon-redshift sql-date-functions sqldatetime

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

  1. 上周六
  2. 之前的星期日
  3. 之前的那个星期六在2点查询了一个星期天。
  4. 之前的星期日是3月的星期六。

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

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

  1. 将会是01/06/2018
  2. 将于2017年12月31日
  3. 将于2017年12月30日
  4. 将于2017年12月24日

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

SELECT *
FROM thisTable
WHERE Date(operation_date) BETWEEN '2018-06-10' AND '2018-06-16'

DBMS:Amazon Redshift

2 个答案:

答案 0 :(得分:1)

DATE_TRUNC Function是您的朋友。它会截断为星期一

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

请注意,它将日期视为一天之初的午夜 。因此,您实际上并不想查询星期日至星期六。您实际上是要查询星期日至星期日(这实际上是指星期日开始的午夜到下一个星期日开始的午夜)。假设您的原始日期为时间戳

如果您的原始日期纯粹是日期,则您要使用星期日至星期六

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

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

(好吧,除非您已经在星期日,但这就是您的问题!)

如果日期是日期,则必须对其进行一些调整。

答案 1 :(得分:0)

最后星期六:date_trunc('week',getdate())-interval '2 day'

上一个星期六:date_trunc('week',getdate())-interval '9 day'

这是基于星期一的一周