我正在尝试将2007年12月1日等单独部分的日期转换为SQL Server 2005中的日期时间。我尝试过以下方法:

CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)

但是这会导致错误的日期。将三个日期值转换为适当的datetime格式的正确方法是什么?


当前回答

如果你不想把字符串排除在外,这也可以(把它放到一个函数中):

DECLARE @Day int, @Month int, @Year int
SELECT @Day = 1, @Month = 2, @Year = 2008

SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, '20000101')))

其他回答

如果你不想把字符串排除在外,这也可以(把它放到一个函数中):

DECLARE @Day int, @Month int, @Year int
SELECT @Day = 1, @Month = 2, @Year = 2008

SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, '20000101')))

SQL Server 2012有一个令人期待已久的新DATEFROMPARTS函数(如果日期无效,它将引发错误-我对基于dateadd的解决方案的主要反对意见):

http://msdn.microsoft.com/en-us/library/hh213228.aspx

DATEFROMPARTS(ycolumn, mcolumn, dcolumn)

or

DATEFROMPARTS(@y, @m, @d)

假设y m d都是int,那么:

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

请参阅我对SQL Server 2012及以上的其他答案

使用显式起点'19000101'更安全、更整洁。

create function dbo.fnDateTime2FromParts(@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int, @Nanosecond int)
returns datetime2
as
begin
    -- Note! SQL Server 2012 includes datetime2fromparts() function
    declare @output datetime2 = '19000101'
    set @output = dateadd(year      , @Year - 1900  , @output)
    set @output = dateadd(month     , @Month - 1    , @output)
    set @output = dateadd(day       , @Day - 1      , @output)
    set @output = dateadd(hour      , @Hour         , @output)
    set @output = dateadd(minute    , @Minute       , @output)
    set @output = dateadd(second    , @Second       , @output)
    set @output = dateadd(ns        , @Nanosecond   , @output)
    return @output
end

尝试CONVERT而不是CAST。

CONVERT允许使用第三个参数表示日期格式。

格式列表在这里:http://msdn.microsoft.com/en-us/library/ms187928.aspx

在另一个答案被选为“正确”答案后更新:

我真的不明白为什么选择的答案明显依赖于服务器上的NLS设置,而没有说明这一限制。