2013-04-30 117 views
8

我在Microsft SQL Server 2008 R2中有一个表,它来自外部源。其中的列如下:ID, Year, DAY, HOUR & Value,其中DAY包含一年中的某一天(从1到366),HOUR代表一天中的小时(从0到23)。从SQL Server 2008 R2的年,日,年中获取日期时间

我希望创建一个新的日期时间列,并使用从Year, DAY & HOUR列中的数据创建的日期时间填充它。

我应该用什么SQL函数从零件中创建DateTime

SQL Server 2012中具有DATETIMEFROMPARTS,但对于SQL Server 2008 R2

+0

退房:http://stackoverflow.com/questions/207190/sql-server-string-to-date-conversion – 2013-04-30 11:21:58

+0

相关:http://stackoverflow.com/a/267016/327074 – icc97 2017-02-23 09:53:47

回答

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

谢谢!我不知道0代表1900-01-01 00:00:00.000。 – 2013-04-30 11:41:05

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

我没有月份或月份的某一天。我只有年,一年中的某一天以及一天中的小时。 – 2013-04-30 11:34:33

+0

我已更新使用您的可用字段,可能会缩短,但它仍然有效! – KaraokeStu 2013-04-30 11:48:03

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月,与数量开始天。

2

为我自己创造了它,并认为这将是一个分享的好地方 - 它基于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, [email protected])*@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