【问题标题】:Get a datetime from year, day of the year and hour in SQL Server 2008 R2从 SQL Server 2008 R2 中的年、日和小时获取日期时间
【发布时间】:2013-04-24 07:09:50
【问题描述】:

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

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

我应该使用什么 SQL 函数从其部分创建 DateTime

SQL Server 2012 有DATETIMEFROMPARTS,但没有SQL Server 2008 R2 的等效函数

【问题讨论】:

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


【解决方案1】:

为我自己创建并认为这是一个分享的好地方 - 它基于 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

【讨论】:

    【解决方案2】:

    您可以改用以下内容:

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

    【讨论】:

    • 我没有月份或日期。我只有年、一年中的一天和一天中的小时。
    • 我已更新为使用您的可用字段,这可能会缩短,但它仍然有效!
    【解决方案3】:

    这里有一个替代解决方案:

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

    【讨论】:

      【解决方案4】:
      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 代表 1900-01-01 00:00:00.000。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多