Sql 根据未来日期确定今年的日期
刚刚出现了一个奇怪的商业请求。我们有几年的合同。系统维护合同的结束日期。我必须确定结束日期的相同日历日期,但如果今年未过去,则为当前年份,如果今年过去,则为下一年 例如,截至今天2020-01-23: 案例1: 输入:合同结束日期2022-07-01 预期产量:2020-07-01(因为2020-07-01尚未通过) 案例2: 输入:合同结束日期2022-01-05 预期产量:2021-01-05(因为2020-01-05已经过去) 我从来没有在网站上发布过一个没有“到目前为止你尝试了什么”代码的问题,但我在这里完全不知所措。我想我可以用字符串操纵日期,然后做一些奇怪的事情来确定日期是否已过,等等。但这项要求是否有人做过,或者准备接受挑战?:-)即使是指导,而不是代码,也会有所帮助。然后我可以用我的想法来编辑这个问题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,乘坐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