在两个动态(可变)日期 SQL 之间进行选择

Posted

技术标签:

【中文标题】在两个动态(可变)日期 SQL 之间进行选择【英文标题】:Select between two dynamic (variable) dates SQL 【发布时间】:2019-09-11 16:22:35 【问题描述】:

我想分享一个每天运行一次的查询,但是我需要删除团队中其他用户必须对其进行编辑的部分。基本上,它在周一至周五运行。如果今天是星期一,我想给我最近 3 天的数据。其他任何一天,只要给我昨天的数据。

到目前为止,这是我所拥有的:

更新:它们都是字符串,所以现在我收到以下错误。

“关键字'BETWEEN'附近的语法不正确。”

DECLARE @daychecker varchar(max) = FORMAT(GETDATE(), 'dddd')
DECLARE @daterange0 varchar(max)
DECLARE @daterange1 varchar(max) = FORMAT(GETDATE()-3, 'yyyy-MM-dd')
DECLARE @daterange2 varchar(max) = FORMAT(GETDATE()-1, 'yyyy-MM-dd')
    IF  @daychecker = 'Wednesday'
        BEGIN
        SET @daterange0 = BETWEEN @daterange1 AND @daterange2
    END
    ELSE
        BEGIN
        SET @daterange0 = FORMAT(GETDATE()-1, 'yyyy-MM-dd')
    END
SELECT @daterange0;

例如今天的结果应该返回昨天的日期。但这不起作用。我会考虑所有选项,包括硬编码某种我们可以计算的主开始日期,比如年初或其他时间。

【问题讨论】:

SET @daterange0 = BETWEEN @daterange1 AND @daterange2 语法无效 【参考方案1】:

您最好定义 2 个日期,即开始日期和结束日期,并根据它们过滤您的查询。编辑:我现在不确定您是否想要过滤数据的实际日期或报告的标签。我修改了我的答案以包括后者,使用任何你想要的并忽略另一个......

DECLARE @DateStart DATE 
DECLARE @DateEnd DATE 
DECLARE @LableRange varchar(max)
SELECT DATEPART(WEEKDAY, GETDATE()) --Sun=1, Mon=2, ...
IF DATEPART(WEEKDAY, GETDATE()) = 2 BEGIN
    SET @DateStart = DATEADD (DAY, -5,GETDATE())
    SET @DateEnd = DATEADD (DAY, -2,GETDATE())
    SET @LableRange = CONCAT(FORMAT(@DateStart, 'yyyy-MM-dd'), ', '
      , FORMAT(DATEADD(day,1,@DateStart), 'yyyy-MM-dd'), ', '
      , FORMAT(DATEADD(day,2,@DateStart), 'yyyy-MM-dd'))
   -- or maybe this format is better
   --SET @LableRange = CONCAT('BETWEEN '
      --, FORMAT(@DateStart, 'yyyy-MM-dd'), ' AND '
      --, FORMAT(DATEADD(day,2,@DateStart), 'yyyy-MM-dd'))
END ELSE BEGIN
    SET @DateStart = DATEADD (DAY, -1,GETDATE())
    SET @DateEnd = GETDATE()
    SET @LableRange = FORMAT(@DateStart, 'yyyy-MM-dd')
END

SELECT @LableRange

SELECT * FROM SomeTable as T
WHERE T.TestDate < @DateEnd AND T.TestDate >= @DateStart 

请注意,即使您过滤的日期是日期时间而不是纯日期,这仍然有效。

【讨论】:

这很有意义,除了一周的开始日期是一个配置值,所以你需要确保检查它 真的,谢谢内维尔!是的,该设置不太可能更改,但可能会设置为从星期一开始一周,在这种情况下,我的测试应该是 = 1 而不是 = 2。 提示:( @@DateFirst + DatePart( weekday, GetDate() ) - 1 ) % 7 + 1 将始终返回一个从17 的整数,其中1 对应于星期日,无论DateFirstLanguage 的设置如何。 是的,我运行它并简单地返回了#4(这是星期三)。当满足第一个条件时,我需要它返回 3 个值。也就是说,在上面的代码 sn-p 中,它应该给我 1,2,3 (sun, mon, tue)。 好的,我修改了它以包含一个描述日期的标签,也许这个标签就是你想要的?如果是这样,您可以删除 @DateEnd 变量

以上是关于在两个动态(可变)日期 SQL 之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以选择两个日期之间的日期

在 CRAN R 中使用 BETWEEN 命令进行 SQL 查询以选择日期

Presto SQL / Athena:在不同日期的时间之间进行选择

MS Access 在两个日期之间进行选择?

SQL Server 2008 仅在月份和年份之间选择数据

检查当前日期是不是在两个日期之间 Oracle SQL