首页 > 解决方案 > SQL查询中如何计算过期日期

问题描述

我有这个查询到期日期计算及其工作正常,但结果显示在 - 例如:-9 年 4 个月和 5 天。

我想以正常的方式展示这一点,例如“在 9 年 4 个月零 5 天后过期”:

DECLARE @TempDate Datetime ,
        @ExpiryDate Datetime, 
        @year     int,
        @month    int,
        @day      int

SET @ExpiryDate = (SELECT TOP (1) [ExpiryDate] FROM [dbo].[Purchases] WHERE [ProductId] = 1)

SELECT @TempDate = @ExpiryDate

SELECT 
    @year = DATEDIFF(YEAR, @TempDate, GETDATE()) -
            CASE
                WHEN (MONTH(@ExpiryDate) > MONTH(GETDATE())) OR
                (MONTH(@ExpiryDate) = MONTH(GETDATE()) AND DAY(@ExpiryDate) > DAY(GETDATE()))
                THEN 1 ELSE 0
            END
SELECT @TempDate = DATEADD(YEAR, @year, @TempDate)

SELECT @month = DATEDIFF(MONTH, @TempDate, GETDATE()) - 
            CASE
                WHEN DAY(@ExpiryDate) > DAY(GETDATE())
                THEN 1 ELSE 0
            END
SELECT @TempDate = DATEADD(MONTH, @month, @TempDate)

SELECT @day = DATEDIFF(DAY, @TempDate, GETDATE())

SELECT @year AS Years, @month AS Months, @day AS [Days]

标签: sqlsql-serversql-server-2014

解决方案


如果我正确理解了您的问题,则计算将按您的预期进行,但您希望将Years值作为正数而不是负数返回。如果是这种情况,您应该将 final 更改SELECT为:

SELECT (@year * -1) AS Years, @month AS Months, @day AS [Days];

或者,如果您想将输出作为字符串返回(即在 9 年 4 个月零 5 天后过期),请将最终更改SELECT为:

SELECT 'Expire in ' + CAST((@year * -1) AS VARCHAR(2)) + ' years ' 
    + CAST(@month AS VARCHAR(2)) + ' months and ' 
    + CAST(@day AS VARCHAR(2)) + ' day';

铸造 asVARCHAR(2)假设您预计不超过 99 年,但您可能希望增加该数字。


推荐阅读