Sql server 使用int值在SQL中设置日期/时间?
我在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
@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。无论如何,如果您想使用这些值转换为日期数据类型,首先应该定义它们。