我有一个名为source_name的表,其填充数据如下所示。
Date Name
------ -------
2010-01-14 a
2010-01-15 b
2010-01-16 c
2010-01-17 bc
2010-01-18 bcc
2010-01-19 bd
2010-01-20 bddd
2010-01-13 be
2010-01-12 beeeee
2010-01-11 beee
2010-01-10 beee
2010-01-09 beee
我需要一个CTE查询来返回以下结果。 这是我的条件。如果我选择@no_of_days = 2和@date ='2010-01-14' 它必须归还我
2010-01-15 b
2010-01-16 c
2010-01-13 be
2010-01-12 beee
我的意思是如果@no_of_days被选为任何数字,那么我希望过滤数据与给定日期到该递增日期的数据完全相同,直到给定的no_of_days和相应的低于它的日期。 另一个例子是@no_of_days = 3和@date ='2010-01-14'
2010-01-15 b
2010-01-16 c
2010-01-17 bc
2010-01-13 be
2010-01-12 beee
2010-01-11 beee
我需要帮助。
答案 0 :(得分:2)
我认为你不需要CTE,也不知道它是如何帮助的。
但是DATEDIFF
函数应该允许你很容易地写一个where子句:
SELECT *
FROM source_name
WHERE ABS(DATEDIFF( day, [Date], @Date )) BETWEEN 1 AND @no_of_days
编辑:正如@MatBailie正确评论的那样,如果你需要筛选大量的索引日期,你不希望在比较Date
列之前插入DATEADD
列的值。{{1是你的朋友。
答案 1 :(得分:2)
;
WITH myTable([Date], [Name])
AS (
SELECT *
FROM source_name
WHERE [Date] BETWEEN DATEADD(day, (@no_of_days*-1), @date) AND DATEADD(day, @no_of_days, @date)
AND [Date] != @Date
)
.... do something here.