我有一个SQL Server表:
CREATE TABLE tblExample
(
ID int,
Name nvarchar(256),
Date datetime,
IsAnual bit
)
这是一个简化的例子。
现在我从GETDATE()
开始扫描接下来的30天。如果有结果,我将信息插入另一个表:
WHERE DATEDIFF(dd, GETDATE(), Date) <= 30
到目前为止没有问题。但是
WHERE IsAnual = 1
我必须考虑到他们的延续。我怎样才能做到这一点?
假设GETDATE()
为2013-10-22
且该列包含2013-10-30
,则没有问题。如果GETDATE()
为2014-10-28
且列包含2013-10-30
且IsAnual = 1,该怎么办?
更新:
我找到了解决方案。我使用了递归查询。
CREATE TABLE tblExample
(
ID int IDENTITY(1,1) PRIMARY KEY NOT NULL,
Name nvarchar(256),
Date datetime,
IsAnual bit
)
并插入了一些行:
INSERT INTO tblExample
(Name, Date, IsAnual)
VALUES
('A', '2012-11-01', 1),
('B', '2013-11-01', 0),
('C', '2013-01-01', 1)
最后一节是正常工作的查询:
WITH TempTable AS
(
SELECT
e.ID,
e.Name,
e.Date,
e.IsAnual
FROM tblExample AS e
UNION ALL
SELECT
e.ID,
e.Name,
DATEADD(yy, 1, t.Date),
e.IsAnual
FROM tblExample AS e
INNER JOIN TempTable AS t
ON e.ID = t.ID
WHERE e.IsAnual = 1
AND DATEDIFF(yy, t.Date, DATEADD(yy, 1, GETDATE())) > 0
)
SELECT
*
FROM TempTable
WHERE DATEDIFF(dd, GETDATE(), Date) BETWEEN 0 AND 30
此处的结果:
14 B 01.11.2013 False
13 A 01.11.2013 True
答案 0 :(得分:1)
WHERE DATEDIFF(dd, GETDATE(),
CASE
WHEN IsAnnual = 0 THEN Date
WHEN IsAnnual = 1 THEN DATEADD(year,DATEDIFF(year,Date,GETDATE()),Date)
END
) <= 30
表达式DATEADD(year,DATEDIFF(year,Date,GETDATE()),Date)
将为您提供Date
列中提供的日期,但其年份设置为当前年份。
我认为这就是你所要求的。
但应注意,上述内容无法利用Date
上的任何索引,因此可能无法在大型表上提供绝对最佳性能。
(我的初步尝试CASE
表达式不正确,但现在希望它是正确的)
答案 1 :(得分:0)
WHERE DATEDIFF( DAY ,DATEADD(YEAR,(1753 -DATEPART(YEAR ,GETDATE())) *IsAnual ,GETDATE()) ,DATEADD(YEAR ,(1753 -DATEPART(YEAR ,Date)) *IsAnual ,Date)) BETWEEN 0 AND 30