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

时间:2013-08-19 21:14:53

标签: sql-server

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

6 个答案:

答案 0 :(得分:14)

对于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))

答案 1 :(得分:6)

SELECT CAST(STR(10000 * Year + 100 * Month + Day) AS DATETIME)

答案 2 :(得分:4)

在SQL Server 2012中,您可能最好避免使用字符串连接或复杂的数学,因为它们创建了一个看似适合您的功能:

SELECT DATEFROMPARTS(2013, 8, 19);

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

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

错误:

  

Msg 289,Level 16,State 1,Line 3   
无法构造数据类型日期,某些参数的值无效。

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

...或...

...在任何版本中,您都可以修复表并在第一时间存储日期(或日期时间)。您可以获得自动验证的所有好处以及三个独立的无关整数无法获得的固有日期/时间功能。当你需要它们(有计算列,视图或查询时)从保证为日期的值中拉出零件时,要比依靠单个零件形成有效日期更好。 ..

答案 3 :(得分: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)

答案 4 :(得分:-1)

如果您的列是字符列

,您可以尝试这样的操作
Select Cast([year] + '-' + [month] + '-' + [day] as datetime)
From yourTable

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

答案 5 :(得分:-2)

使用Convert功能

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

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