您能否帮助找到最接近的2月1日至当前日期?
以下脚本只有在当前年份运行时才能正常运行:
select DATEADD(MONTH,1,DATEADD(year, DATEDIFF(year, -1, GETDATE()), 0))
但是如果它将在明年1月开始运行,它将产生不正确的结果。
提前谢谢!
答案 0 :(得分:1)
使用IIF
和DATEFROMPARTS
select IIF(month(getdate()) > 2,
DATEFROMPARTS(YEAR(Getdate()),2,1),DATEFROMPARTS(YEAR(Getdate())-1,2,1) )
如果您使用的是旧版本,那么
select Case When month(getdate()) > 2
then CAST(CAST(YEAR(getdate()) as char(4))+'-02-01' as date)
else CAST(CAST(YEAR(getdate()) - 1 as char(4))+'-02-01' as date)
end
答案 1 :(得分:1)
您的问题可以通过两种不同的方式解释:第一种是找到下一个最接近的2月1日(即Feb 2 2016
将返回Feb 1 2017
),第二种是找到最接近的2月1日当前日期(即Feb 2 2016
将返回Feb 1 2016
)。
Prdp已经为前者提供了答案,所以这种方法(我确信可以简化)将适用于后者。
这将考虑当前年份的2月1日和明年的2月1日,并计算两者中的DateDiff()
天数,并选择最接近的一天。
;With Dates As
(
Select ThisFeb = DateFromParts(Year(GetDate()), 2, 1),
NextFeb = DateFromParts(Year(GetDate()) + 1, 2, 1)
), Distance (Date, Distance) As
(
Select ThisFeb, Abs(DateDiff(Day, GetDate(), ThisFeb)) As ThisFebDiff
From Dates
Union All
Select NextFeb, Abs(DateDiff(Day, GetDate(), NextFeb)) As NextFebDiff
From Dates
)
Select Top 1 Date
From Distance
Order By Distance Asc
答案 2 :(得分:0)
试试这个:
SELECT
CASE WHEN
DATEDIFF(dd,CAST(CONCAT(year(GETDATE()),'-02-01') AS DATE),GETDATE()) < 183
THEN CAST(CONCAT(year(GETDATE()),'-02-01') AS DATE)
ELSE CAST(CONCAT(year(GETDATE())+1,'-02-01') AS DATE) END as ClosestFebFirst
答案 3 :(得分:0)
这是另一种可能的解决方案......
DECLARE @SomeDate DATE = '2017-06-30';
SELECT TOP 1
ClosestFebFirst = CASE WHEN dd.Diff1 < dd.Diff2 THEN pd.D1 ELSE pd.D2 END
FROM
( VALUES (
DATEFROMPARTS(YEAR(@SomeDate), 2, 1),
DATEFROMPARTS(YEAR(@SomeDate) + 1, 2, 1)
)
) pd (D1, D2)
CROSS APPLY ( VALUES (
ABS(DATEDIFF(dd, @SomeDate, pd.D1)),
ABS(DATEDIFF(dd, @SomeDate, pd.D2))
)
) dd (Diff1, Diff2);