请帮忙找到离当前日期最近的2月1日。
以下脚本仅在当前年份运行时才能正常工作:
select DATEADD(MONTH,1,DATEADD(year, DATEDIFF(year, -1, GETDATE()), 0))
但是如果它在明年一月运行,将会产生不正确的结果。
提前感谢你!
请帮忙找到离当前日期最近的2月1日。
以下脚本仅在当前年份运行时才能正常工作:
select DATEADD(MONTH,1,DATEADD(year, DATEDIFF(year, -1, GETDATE()), 0))
但是如果它在明年一月运行,将会产生不正确的结果。
提前感谢你!
2016年2月2日
将返回2016年2月1日
),第二种是找到距离当前日期最近的2月1日(例如,2016年2月2日
将返回2016年2月1日
)。;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
尝试使用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
试试这个:
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
这是另一个可能的解决方案...
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);