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

在两个动态(可变)日期之间选择SQL,sql,tsql,Sql,Tsql,我有一个每天运行一次的查询,我想与大家分享,但是我需要删除团队中其他用户需要编辑的部分。基本上,它是从周一到周五运行的。我想,如果今天是星期一,给我最后3天的数据。其他任何一天,只要给我昨天的数据 到目前为止,这就是我所拥有的: 更新:它们都是字符串,所以现在我得到以下错误 关键字“BETWEEN”附近的语法不正确 例如,今天的结果应该返回昨天的日期。但这不起作用。我会考虑所有的选项,包括硬编码一些主要的开始日期,我们可以从今年年初或类似的事情开始计数。 < P>你最好定义2个日期、开始日期和结

我有一个每天运行一次的查询,我想与大家分享,但是我需要删除团队中其他用户需要编辑的部分。基本上,它是从周一到周五运行的。我想,如果今天是星期一,给我最后3天的数据。其他任何一天,只要给我昨天的数据

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

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

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


例如,今天的结果应该返回昨天的日期。但这不起作用。我会考虑所有的选项,包括硬编码一些主要的开始日期,我们可以从今年年初或类似的事情开始计数。

< P>你最好定义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 

请注意,即使您正在筛选的日期是日期时间而不是纯日期,这也可以使用。

这很有意义,只是一周的开始日期是一个配置值,因此您需要确保检查该值是否正确,谢谢Neville!是的,该设置不太可能更改,但它可能设置为星期一开始,在这种情况下,我的测试应该是=1而不是=2。提示:@@DateFirst+DatePart weekday,GetDate-1%7+1将始终返回一个从1到7的整数,其中1对应于星期天,而不管DateFirst或Language的设置如何。是的,我运行了它并简单地返回了4,即星期三。当第一个条件满足时,我需要它返回3个值。也就是说,在上面的代码片段中,它应该给我1,2,3个sun,mon,tue。好的,我修改了它,添加了一个描述日期的标签,也许这个标签就是你想要的?如果是这样,您可以删除@DateEnd variableSET@daterange0=在@daterange1和@daterange2之间的无效语法
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