0

我有一个 SQL Server 表:

CREATE TABLE tblExample
(
ID int,
Name nvarchar(256),
Date datetime,
IsAnual bit
)

这是一个简化的例子。

现在我扫描接下来的 30 天GETDATE()。如果有结果,我将信息插入另一个表:

WHERE DATEDIFF(dd, GETDATE(), Date) <= 30

到现在都没有问题。但

WHERE IsAnual = 1

我必须考虑到他们的延续。我怎样才能做到这一点?

假设GETDATE()2013-10-22并且列包含2013-10-30,没有问题。如果GETDATE()is2014-10-28和列包含2013-10-30AND 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
4

2 回答 2

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表达不正确,但现在希望是正确的)

于 2013-10-22T10:46:59.457 回答
0
WHERE DATEDIFF( DAY ,DATEADD(YEAR,(1753 -DATEPART(YEAR ,GETDATE())) *IsAnual ,GETDATE()) ,DATEADD(YEAR ,(1753 -DATEPART(YEAR ,Date)) *IsAnual ,Date)) BETWEEN 0 AND 30
于 2013-10-22T13:31:26.947 回答