Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用int值在SQL中设置日期/时间?_Sql Server_Sql Server 2008 - Fatal编程技术网

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

Sql server 使用int值在SQL中设置日期/时间?,sql-server,sql-server-2008,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值转换为d

我在SQL脚本中有以下整型值:
@year
@month
@day
。现在我想把它们转换成日期时间值。应该很容易吧

嗯,我只是浏览了SQL文档,非常惊讶地发现除了转换为字符串然后再转换为日期时间之外,我找不到任何方法来实现这一点

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

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

不是现成的,但是您可以创建一个实现这一点的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以更复杂(但速度可能稍快)的方式来完成。可以在(stackoverflow.com)上找到这方面的示例。

您无需像这样转换为字符串即可完成此操作。它不是一个单一的函数,这很好,但它可以工作:

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

另一种捷径方法

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)

认真地MS真的没有提供从日期部分创建日期的本机方法吗?在创建日期之前,必须将整数转换为字符串?我简直吓坏了!是的,考虑到这些事实,使用UDF将是一条可行之路——但我对这一切的愚蠢完全无言以对。我担心的是,这是SQL Server中的一个大错误。不,它没有做到这一点——t-SQL有点小麻烦。请注意,如果您以YYYY-MM-DD的形式构造日期,则转换日期是最简单的。公平地说,我不认为Oracle中的日期()更方便。好的,这不是我所希望的答案,但要准确,因为您得到了第一个答案,我将给您评分。Shaul,SQL Server从2012版开始简化了这一过程,选择DATETIMEFROMPARTS(@YEAR、@MONTH、@DAY、0,0,0)是的,但它仍然依赖字符串转换来创建
@d
的原始值。..@d是日期时间。如果它在赋值运算符的另一侧有一个类似字符串文字的内容,那么您可以将其从脚本中完全删除,只需在最终函数中将0放在它的位置。为什么不将值定义为varchar,因为它们应该放在第一位。这些是字符串数据而不是整数数据,就像zip是字符串数据或电话号码是字符串数据一样。@HLGEM:我认为这有点不同。你几乎不会对邮政编码或电话号码进行算术运算,但年/月/日的情况并非如此。这些数字表示自月初起的天数、自年初起的月数、自BC/AD切换起的年数。邮政编码或电话号码只是一个碰巧是数字的代码。我不同意,我用datetime数据类型计算所有日期,其他的只用于显示。月和日通常需要前导零,因此最好不要将它们存储为int。无论如何,如果您想使用这些值转换为日期数据类型,首先应该定义它们。