9

我有一个包含 2013、2012 等内容的年份列。一个显示 1-12 的月份列和一个包含 1-31 的天列。我需要运行一个连接它们并将它们转换为实际日期的选择,但我不确定如何去做。任何人都可以提供一些输入吗?

4

6 回答 6

17

对于 SQL Server 2008+:

SELECT CONVERT(DATE,CAST([Year] AS VARCHAR(4))+'-'+
                    CAST([Month] AS VARCHAR(2))+'-'+
                    CAST([Day] AS VARCHAR(2)))

对于 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))
于 2013-08-19T21:17:51.000 回答
7

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

SELECT DATEFROMPARTS(2013, 8, 19);

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

SELECT TRY_CONVERT(DATE, DATEFROMPARTS(2013, 2, 31));

错误:

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

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

...或者...

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

于 2013-08-20T01:40:29.360 回答
6
SELECT CAST(STR(10000 * Year + 100 * Month + Day) AS DATETIME)
于 2013-08-19T21:27:35.497 回答
0

还有一个,只是为了填写各种方法的列表:

select
    dateadd(d, t.d-1, dateadd(m, t.m-1, dateadd(yy, t.y-1900, 0)))
from (values 
        (2011, 10, 26)
        ,(2012, 1, 5)
        ,(2013, 7, 15)
    ) t(y, m, d)
于 2013-08-19T21:33:30.837 回答
-1

如果您的列是字符列,您可以尝试这样的事情

Select Cast([year] + '-' + [month] + '-' + [day] as datetime)
From yourTable

如果它们是数字,则需要在连接之前将每列转换为 varchar,否则您最终会得到一些时髦的东西

于 2013-08-19T21:18:46.600 回答
-2

使用Convert功能

Select Convert(datetime ,YEAR + '/' + MM + '/' + DAY) 

替换YEAR为您的年份列、MM月份和DAY日期列。并连接以制定您的日期字符串

于 2013-08-19T21:18:50.990 回答