如何将单独的年,月和日列转换为单个日期?

use*_*820 7 sql-server

我有一个年份列,其中包含2013年,2012年等内容.显示1-12的月份列和包含1-31的日期列.我需要运行一个连接它们并将它们作为实际日期进行转换的选择,但我不确定如何解决这个问题.谁能提供一些输入?

Lam*_*mak 14

对于SQL Server 2008+:

SELECT CONVERT(DATE,CAST([Year] AS VARCHAR(4))+'-'+
                    CAST([Month] AS VARCHAR(2))+'-'+
                    CAST([Day] AS VARCHAR(2)))
Run Code Online (Sandbox Code Playgroud)

对于SQL Server 2005:

SELECT CONVERT(DATETIME,CAST([Year] AS VARCHAR(4))+
                        RIGHT('00'+CAST([Month] AS VARCHAR(2)),2)+
                        RIGHT('00'+CAST([Day] AS VARCHAR(2)),2))
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 7

在 SQL Server 2012 中,您最好避免字符串连接或复杂的数学运算,因为它们似乎为您创建了一个函数:

SELECT DATEFROMPARTS(2013, 8, 19);
Run Code Online (Sandbox Code Playgroud)

当然,首先存储错误的数据可能会导致问题 - 例如,什么约束阻止 y = 2013、m = 2 和 d = 31 出现在表中?你会认为你可以用 包装它TRY_CONVERT(),但不是那么多:

SELECT TRY_CONVERT(DATE, DATEFROMPARTS(2013, 2, 31));
Run Code Online (Sandbox Code Playgroud)

错误:

消息 289,级别 16,状态 1,第 3 行
无法构造数据类型日期,某些参数的值无效。

因此,为了防止不良数据进入这三列,您将需要在检查约束或触发器中使用上述繁琐方法之一...

...或者...

...在任何版本中,您都可以首先修复表格并存储日期(或日期时间)。您可以获得自动验证的所有好处以及使用三个独立的不相关整数无法获得的内在日期/时间功能。当您需要从保证为日期的值中单独(使用计算列、视图或查询时)提取这些部分时,比尝试依赖各个部分来形成有效日期要好得多。 ..


bum*_*mmi 6

SELECT CAST(STR(10000 * Year + 100 * Month + Day) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)