Sql 如何将分隔的年(int)、月(int)和日(int)列转换为日期时间

Sql 如何将分隔的年(int)、月(int)和日(int)列转换为日期时间,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们的ERP系统在单独的int列中包含年、月和日。我想将这3个int列组合成一个DateTime,如何在SQL Server中转换它 Year | Month | Day -------------------- 2016 | 1 | 23 您可以使用(SQL Server 2012+): SQL Server 2008(假设该年份为4位数): 如注释中所建议,利用YYYYMMDD作为INT转换为DATE: SELECT CAST(CAST([year] * 10000 + [

我们的ERP系统在单独的int列中包含年、月和日。我想将这3个int列组合成一个DateTime,如何在SQL Server中转换它

Year | Month | Day
--------------------
2016 | 1     | 23 
您可以使用(
SQL Server 2012+
):


SQL Server 2008
(假设该年份为4位数):


如注释中所建议,利用
YYYYMMDD
作为
INT
转换为
DATE

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

补遗 为了解决有关dateformat的问题,我们可以利用不受
dateformat
语言设置影响的数据格式:

yyyy-mm-ddThh:mm:ss[.mmm]


要处理1000年之前的年份,应使用零填充。

我们可以使用SQL的转换函数获取日期时间值:

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(2), Day) + '/' + CONVERT(VARCHAR(2), Month) + '/' + CONVERT(VARCHAR(4), Year),103) FROM Table_Name

@ayilmaz还有
DATETIMEFROMPARTS
和更多的datetime函数:)不幸的是,服务器是2008年的。我能用什么?我会认为你的答案是正确的,顺便说一句,我认为一个比较简单的解决办法是将
转换为日期(cast(年*10000+月*100+日为varchar(8))
,但这是相同的想法。@GordonLinoff是的,只有两个转换而不是4:)你可以跳过
+'-
YYYYMMDD
格式适用于日期和日期时间。但是您应该注意,在左边用0填充月份和日期。
SELECT CAST(CAST([year] * 10000 + [month]*100 + [day] AS VARCHAR(8)) 
           AS DATE) AS DateTim
FROM table_name;
 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
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(2), Day) + '/' + CONVERT(VARCHAR(2), Month) + '/' + CONVERT(VARCHAR(4), Year),103) FROM Table_Name