SQL Server 最近的2月1日

3

请帮忙找到离当前日期最近的2月1日。

以下脚本仅在当前年份运行时才能正常工作:

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

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

提前感谢你!

4个回答

1
你的问题可以有两种不同的解释:第一种是找到下一个最接近2月1日的日期(例如,2016年2月2日将返回2016年2月1日),第二种是找到距离当前日期最近的2月1日(例如,2016年2月2日将返回2016年2月1日)。
Prdp已经回答了前者,因此这个方法(我相信可以简化)将用于后者。
这将考虑到今年和明年的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

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

好主意,比较当前月份和数字2的数量。谢谢,Prdp! - David Freeman
我认为在你的底部语句中多了一个闭合括号。而且,20170102 不应该返回 20170201,因为自 2017 年 2 月 1 日起是最接近 2017 年 1 月 1 日的时间点。@DavidFreeman - S3S
1
@scsimon - 已更新。谢谢兄弟。 - Pரதீப்
没问题 -- @prdb - S3S
我将只使用当前方法的思路,而不是这段代码的确切内容。 - David Freeman

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

未来请使用“最接近”的翻译 :) - David Freeman
@DavidFreeman 我会为了更清晰明确的问题将其添加到原始问题中。 - S3S

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接