从SQL Server 2008 R2中的年,日和小时获取日期时间

时间:2013-04-30 11:19:16

标签: sql datetime sql-server-2008-r2

我在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

没有等效功能

4 个答案:

答案 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作为月份,从天数开始。