我在Microsft SQL Server 2008 R2中有一个表,它来自外部源。其中的列如下:ID, Year, DAY, HOUR & Value
,其中DAY
包含一年中的某一天(从1到366),HOUR
表示一天中的小时(从0到23)
我希望创建一个新的datetime列,并使用从Year, DAY & HOUR
列中的数据创建的dateTime填充它。
我应该使用什么SQL函数从其部分创建DateTime
?
SQL Server 2012有DATETIMEFROMPARTS
,但SQL Server 2008 R2
答案 0 :(得分:7)
declare @Year int = 2003
declare @Day int = 100
declare @Hour int = 13
select dateadd(hour, @Hour, dateadd(dayofyear, @Day - 1, dateadd(year, @Year - 1900, 0)))
答案 1 :(得分:4)
您可以改用以下内容:
DECLARE @day int, @month int, @year int
SELECT @day = 4, @month = 3, @year = 2011
SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)
这会给你你的约会(尽管SQL 2012确实是正确的,最后!)
要在年份,年中和一天中的某小时使用它,请使用以下内容:
declare @year int, @dayofyear int, @hourofday int
select @year = 2013, @dayofyear = 120, @hourofday = 12
select dateadd(hh, @hourofday, dateadd(yy, @year - 1900, dateadd(dd, @dayofyear - 1, 0)))
答案 2 :(得分:3)
为自己创造并认为这将是一个分享的好地方 - 它基于Mikael Eriksson的样本。
CREATE FUNCTION [dbo].[DATETIME2FROMPARTS](
@year int,
@month int,
@day int,
@hour int,
@minute int,
@second int,
@fractions int,
@precision int)
RETURNS datetime2(7)
AS
BEGIN
RETURN
DATEADD(NANOSECOND, POWER(10, 9-@precision)*@fractions,
DATEADD(SECOND, @second,
DATEADD(MINUTE, @minute,
DATEADD(HOUR, @hour,
DATEADD(DAY, @day-1,
DATEADD(MONTH, @month-1,
DATEADD(YEAR, @year-1900,
CAST(CAST(0 AS datetime) AS datetime2(7)))))))));
END
答案 3 :(得分:0)
这是另一种解决方案:
create table yourtable (yr int, dy int, hr int);
insert into yourtable values (2013,100,5);
insert into yourtable values (2013,1,1);
select dateadd(hour,hr,dateadd(month, (yr - 1900) * 12 , dy - 1))
from yourtable
概念是将日期添加到日期,使用年份(年 - 1900)* 12作为月份,从天数开始。