在sql server中以月份和年份的格式表示日期之间的case语句

时间:2016-11-18 17:57:41

标签: sql sql-server

我需要根据以下条件在EXPIRATION_DATE PERMIT表的ATR_CERT_DATE Facility表格中插入数据

  

如果ATR_CERT_DATE介于1/1(m / day)和7/31(m / day)之间,那么   EXPIRATION_DATE是12/31 / YY(当年)

     

如果ATR_CERT_DATE介于8/1 / YY和12/31 / YY之间,那么EXPIRATION_DATE   是12/31 / YY + 1(明年)

例如,

ATR_CERT_DATE中的数据如下所示

ATR_CERT_DATE
----
1996-12-30
2001-01-22

EXPIRATION_DATE中的预期结果应该是

EXPIRATION_DATE
----
1997-12-31
2001-12-31

我试过了:

SELECT DISTINCT ATR_CERT_DATE
    ,CASE 
        WHEN CONVERT(VARCHAR(2), MONTH(ATR_CERT_DATE)) + '-' + CONVERT(VARCHAR(2), DAY(ATR_CERT_DATE)) BETWEEN '01-01' AND '07-31'
            THEN cast(datepart(yyyy, ATR_CERT_DATE) AS VARCHAR) + '-' + '12-31'
        WHEN CONVERT(VARCHAR(2), MONTH(ATR_CERT_DATE)) + '-' + CONVERT(VARCHAR(2), DAY(ATR_CERT_DATE)) BETWEEN '08-01' AND '12-31'
            THEN cast(datepart(yyyy, DATEADD(year, 1, ATR_CERT_DATE)) AS VARCHAR) + + '-' + '12-31'
        ELSE '2'
        END AS Effective_date
FROM facility.[dbo].[UST_ATR_HISTORY]
WHERE ATR_CERT_DATE IN (
        '1996-12-30'
        ,'2001-01-22'
        )

此查询几乎提供了预期的结果,除了它是varchar而不是所需的datetime类型。我怎样才能从中获取DateTime?

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT DISTINCT 
    ATR_CERT_DATE,
    case 
        when month(ATR_CERT_DATE) <= 7 
            then dateadd(yyyy, datediff(yyyy, 0, ATR_CERT_DATE) + 1, -1)
            else dateadd(yyyy, datediff(yyyy, 0, ATR_CERT_DATE) + 2, -1)
    end as Effective_date
FROM facility.[dbo].[UST_ATR_HISTORY]
WHERE ATR_CERT_DATE IN ('1996-12-30','2001-01-22')

首选,因为我们无法从日期转换为字符串并再次返回,此处我们只是保留日期类型。

答案 1 :(得分:1)

要将处理过的数据插入console.log("Hello World")表,您可以使用

Permit

(如果您使用的是SQL Server 2012或更高版本,可以稍微简化一下。)

示例输入:

INSERT INTO [Permit] ([ID], [EXPIRATION_DATE])
SELECT [ID],
       [EXPIRATION_DATE] = 
        CASE
            WHEN DATEPART(month, UAH.ATR_CERT_DATE) < 8
                THEN CAST((CONVERT(VARCHAR, DATEPART(YEAR, UAH.ATR_CERT_DATE)) + '-12-31') AS DATETIME)
            ELSE CAST((CONVERT(VARCHAR, DATEPART(YEAR, UAH.ATR_CERT_DATE) + 1) + '-12-31') AS DATETIME)
        END
        FROM [UST_ATR_HISTORY] AS UAH

示例结果:

ID          ATR_CERT_DATE
----------- -----------------------
1           1996-12-30 00:00:00.000
77          2001-01-22 00:00:00.000

答案 2 :(得分:0)

简单的方法是将您已经重新获得的varchar数据转换回日期时间。您将查询包装在仅进行转换的外部查询中:

SELECT CAST(a.EXPIRATION_DATE as datetime) as EXPIRATION_DATE
FROM
    (
    [Your existing query]
    ) as a

这不会解决问题的原因,但它应该能够提供您想要的结果。