我有一个包含 2013、2012 等内容的年份列。一个显示 1-12 的月份列和一个包含 1-31 的天列。我需要运行一个连接它们并将它们转换为实际日期的选择,但我不确定如何去做。任何人都可以提供一些输入吗?
6 回答
对于 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))
在 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
无法构造数据类型日期,某些参数的值无效。
因此,为了防止不良数据进入这三列,您需要在检查约束或触发器中使用上述繁琐的方法之一......
...或者...
...在任何版本中,您都可以首先修复表格并存储日期(或日期时间)。您可以获得自动验证的所有好处以及内在的日期/时间功能,这是您使用三个独立的不相关整数所没有的。当您需要它们时(使用计算列、视图或在查询时)从一个保证为日期的值中单独提取这些部分要好得多,而不是尝试依赖各个部分来形成一个有效的日期。 ..
SELECT CAST(STR(10000 * Year + 100 * Month + Day) AS DATETIME)
还有一个,只是为了填写各种方法的列表:
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)
如果您的列是字符列,您可以尝试这样的事情
Select Cast([year] + '-' + [month] + '-' + [day] as datetime)
From yourTable
如果它们是数字,则需要在连接之前将每列转换为 varchar,否则您最终会得到一些时髦的东西
使用Convert
功能
Select Convert(datetime ,YEAR + '/' + MM + '/' + DAY)
替换YEAR
为您的年份列、MM
月份和DAY
日期列。并连接以制定您的日期字符串