使用int值在SQL中设置日期/时间?

时间:2010-06-23 12:39:54

标签: sql-server sql-server-2008

我在SQL脚本中有以下整数类型值:@year@month@day。现在我想将它们转换为日期时间值。应该很容易,对吧?

好吧,我刚刚浏览了SQL文档,并且非常惊讶于我找不到任何方法来执行此操作,除了转换为字符串然后转换为日期时间。

declare @dt datetime
set @dt= convert(varchar,@year)+'/'+convert(varchar,@month)+'/'+convert(varchar,@day)

这是可怕的!当然必须有一种方法可以直接从int值转换为datetime?

3 个答案:

答案 0 :(得分:1)

不是开箱即用的,但您可以创建一个执行此操作的UDF,例如:

create function ints2date (@year int, @month int, @day int) 
returns datetime 
as begin
    declare @foo varchar (10)

    set @foo = convert (varchar, @year) + '-' +
               convert (varchar, @month) + '-' +
               convert (varchar, @day)
    return convert (datetime, @foo)
end
go               

select dbo.ints2date (2000,1,1)

您还可以使用dateadd / datepart以更复杂的方式(但可能稍微更快)完成此操作。可以在Create a date with T-SQL(stackoverflow.com)找到此示例。

答案 1 :(得分:1)

您可以在不转换为此类字符串的情况下执行此操作。它不是一个单一的功能,它会很好,但它可以工作:

DECLARE
    @year   SMALLINT,
    @month  TINYINT,
    @day    TINYINT,
    @d      DATETIME

SET @year = 2010
SET @month = 6
SET @day = 23
SET @d = '1900-01-01'

SELECT
    DATEADD(dy, @day - 1, DATEADD(mm, @month - 1, DATEADD(yy, @year - 1900, @d)))

答案 2 :(得分:0)

另一种快捷方法

DECLARE 
    @year   SMALLINT, 
    @month  TINYINT, 
    @day    TINYINT, 
    @d      DATETIME 

SET @year = 2010 
SET @month = 6 
SET @day = 23 

SELECT cast(cast(@year*10000+@month*100+@day  as char(8)) as datetime)

SELECT cast(ltrim(@year*10000+@month*100+@day)  as datetime)