如何将分隔的Year(int),Month(int)和Day(int)列转换为DateTime

Ari*_*MAZ 2 sql t-sql sql-server

我们的ERP系统在单独的int列中保存年,月和日.我想将这3个int列合并为一个DateTime,如何在SQL Server中将其转换.

Year | Month | Day
--------------------
2016 | 1     | 23 
Run Code Online (Sandbox Code Playgroud)

Luk*_*zda 10

你可以使用DATEFROMPARTS(SQL Server 2012+):

SELECT DATEFROMPARTS([Year], [Month], [Day]) AS DateTim
FROM table_name
Run Code Online (Sandbox Code Playgroud)

SQL Server 2008 (假设那一年是4位数):

SELECT CAST(CAST([year]  AS VARCHAR(4)) + '-' + 
            CAST([month] AS VARCHAR(2)) + '-' + 
            CAST([day]   AS VARCHAR(2)) 
       AS DATE) AS DateTim
FROM table_name;
Run Code Online (Sandbox Code Playgroud)

LiveDemo


正如戈登·利诺夫在评论提出利用YYYYMMDD作为INT转换为DATE:

SELECT CAST(CAST([year] * 10000 + [month]*100 + [day] AS VARCHAR(8)) 
           AS DATE) AS DateTim
FROM table_name;
Run Code Online (Sandbox Code Playgroud)

LiveDemo2

附录

为了解决ypercubeᵀᴹ对dateformat的担忧,我们可以利用ISO-8601不受其影响DATEFORMATLANGUAGE设置:

YYYY-MM-DDTHH:MM:SS [.mmm]

 SELECT CAST(RIGHT('000'+ CAST([year]  AS VARCHAR(4)),4) + '-' + 
             RIGHT('0'  + CAST([month] AS VARCHAR(2)),2) + '-' + 
             RIGHT('0'  + CAST([day]   AS VARCHAR(2)),2) + 'T00:00:00' AS DATE)
 FROM table_name
Run Code Online (Sandbox Code Playgroud)

LiveDemo3

处理1000之前的年份应该用零填充.