-2

刚刚出现了一个奇怪的业务请求。我们有多年的合同。系统维护合同的结束日期。我必须确定结束日期的相同日历日期,但如果今年没有过去,则为当年,如果今年已过,则为下一年。

例如,截至今天,2020-01-23:

情况1:

输入:合同结束日期 2022-07-01

预期产出: 2020-07-01(因为 2020-07-01 还没有过去)

案例二:

输入:合同结束日期 2022-01-05

预期产出: 2021-01-05(因为 2020-01-05 已经过去了)

我从来没有在没有一些“到目前为止你尝试了什么”代码的情况下发布关于 SO 的问题,但我在这里完全不知所措。我想我可以对日期进行字符串操作,并做一些时髦的事情来确定日期是否已过,等等。但是这个要求是否有人曾经做过,或者正在接受挑战?:-) 即使是非代码指导也会有所帮助。然后我可以用我想出的东西来编辑这个问题。


编辑:

以另一种方式改写问题,给定未来的日期,我如何根据“今天”确定该未来日期的那一天/一个月的下一次出现。

在 2020-01-23,取 2022-07-01 并到达 2020-07-01(下一次发生在 7 月 1 日)

在 2020-01-23,取 2024-01-05 并到达 2021-01-05(下一次是 1 月 5 日)

4

2 回答 2

4

DateAdd在,cross apply和-的帮助下,case解决方案比您想象的要简单。
首先,创建并填充示例表(在以后的问题中保存我们这一步):

DECLARE @T AS TABLE
(
    ContractEndDate date
);

INSERT INTO @T (ContractEndDate) VALUES
('2022-07-01'), 
('2023-01-05');

然后,我使用了一个变量来硬编码日期,但你自然应该使用GetDate()这个:

DECLARE @Today Date = '2020-01-23';

查询本身是这样的:

SELECT  ContractEndDate, -- This is just for reference
        ThisYear, -- This is just for reference
        -- add a year in case we've passed the date
        CASE WHEN (ThisYear < @Today) 
        THEN 
            ThisYear 
        ELSE 
            DATEADD(YEAR, 1, ThisYear) 
        END As Result
FROM @T
CROSS APPLY
(
    -- Get the date of the contract end in the current year
    SELECT CAST(
            DATEADD(YEAR, YEAR(@Today)-YEAR(ContractEndDate), ContractEndDate)
        As Date) As ThisYear
) t

结果:

ContractEndDate     ThisYear    Result
2022-07-01          2022-07-01  2021-07-01  
2023-01-05          2023-01-05  2020-01-05
于 2020-01-23T21:38:50.360 回答
-1

但是这个问题有点不清楚,您只能选择月份和日期并尝试单独匹配日期:

SELECT FORMAT (getdate(), 'dd-MM') as date

最好拥有您正在构建的模式和查询,以便我们了解问题所在。

于 2020-01-23T20:59:30.747 回答