在两个动态(可变)日期 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
将始终返回一个从1
到7
的整数,其中1
对应于星期日,无论DateFirst
或Language
的设置如何。
是的,我运行它并简单地返回了#4(这是星期三)。当满足第一个条件时,我需要它返回 3 个值。也就是说,在上面的代码 sn-p 中,它应该给我 1,2,3 (sun, mon, tue)。
好的,我修改了它以包含一个描述日期的标签,也许这个标签就是你想要的?如果是这样,您可以删除 @DateEnd 变量以上是关于在两个动态(可变)日期 SQL 之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章
在 CRAN R 中使用 BETWEEN 命令进行 SQL 查询以选择日期