8

我在 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 有,但SQL Server 2008 R2DATETIMEFROMPARTS没有等效功能

4

4 回答 4

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)))
于 2013-04-30T11:32:36.027 回答
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)))
于 2013-04-30T11:27:33.643 回答
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
于 2013-10-08T00:29:48.120 回答
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 作为月份,从天数开始。

于 2013-04-30T11:37:26.837 回答