Sql 根据未来日期确定今年的日期

Sql 根据未来日期确定今年的日期,sql,tsql,sql-server-2008-r2,date-manipulation,Sql,Tsql,Sql Server 2008 R2,Date Manipulation,刚刚出现了一个奇怪的商业请求。我们有几年的合同。系统维护合同的结束日期。我必须确定结束日期的相同日历日期,但如果今年未过去,则为当前年份,如果今年过去,则为下一年 例如,截至今天2020-01-23: 案例1: 输入:合同结束日期2022-07-01 预期产量:2020-07-01(因为2020-07-01尚未通过) 案例2: 输入:合同结束日期2022-01-05 预期产量:2021-01-05(因为2020-01-05已经过去) 我从来没有在网站上发布过一个没有“到目前为止你尝试了什么”代码

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

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

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

预期产量:2020-07-01(因为2020-07-01尚未通过)

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

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

我从来没有在网站上发布过一个没有“到目前为止你尝试了什么”代码的问题,但我在这里完全不知所措。我想我可以用字符串操纵日期,然后做一些奇怪的事情来确定日期是否已过,等等。但这项要求是否有人做过,或者准备接受挑战?:-)即使是指导,而不是代码,也会有所帮助。然后我可以用我的想法来编辑这个问题


编辑: 以另一种方式重新表述问题,给定未来日期,我如何根据“今天”确定未来日期的下一天/月份

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


在2020-01-23,选择2024-01-05,然后到达2021-01-05(下一次发生在1月5日)

问题有点不清楚,但是,您可以只选择月份和日期,并尝试单独通过它们匹配日期:

选择格式(getdate(),'dd MM')作为日期

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

借助于
DateAdd
交叉应用
案例
-解决方案比您想象的要简单。
首先,创建并填充样本表(请在以后的问题中保存此步骤):

然后,我使用了一个变量来硬编码日期,但是对于这个变量,您自然应该使用
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

输入的合同结束日期是否会是已经过去的日期?否。我仅将数据限制为活动合同。理论上,结束日期可能是明天,或者10天内,4年内,等等。ContractEndDate-year(ContractEndDate-current_Date)@jarlh,它显示了这个错误:Msg 8117,16级,状态1,第11行操作数数据类型Date对于减法运算符无效。它只是伪sql,我不知道sql Server。模式无关紧要,因为它只是一个日期数据类型字段。
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