SQL Server最接近2月1日

时间:2017-06-30 15:50:48

标签: sql sql-server

您能否帮助找到最接近的2月1日至当前日期?

以下脚本只有在当前年份运行时才能正常运行:

select DATEADD(MONTH,1,DATEADD(year, DATEDIFF(year, -1, GETDATE()), 0))

但是如果它将在明年1月开始运行,它将产生不正确的结果。

提前谢谢!

4 个答案:

答案 0 :(得分:1)

使用IIFDATEFROMPARTS

尝试这样的操作
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);