2013-04-30 8 views
8

Mam tabelę w Microsft SQL Server 2008 R2, który pochodzi z zewnętrznego źródła. Kolumny są następujące: ID, Year, DAY, HOUR & Value, gdzie DAY zawiera dzień roku (od 1 do 366), a HOUR oznacza godzinę dnia (od 0 do 23).Otrzymaj datetime od roku, dnia roku i godziny w SQL Server 2008 R2

Chcę utworzyć nową kolumnę datetime i wypełnić ją datą czasu utworzoną na podstawie danych w kolumnach Year, DAY & HOUR.

Jakiej funkcji SQL powinienem użyć, aby utworzyć DateTime z jej części?

SQL Server 2012 ma DATETIMEFROMPARTS, ale nie ma odpowiednika funkcja SQL Server 2008 R2

+0

Check out: http://stackoverflow.com/questions/207190/sql-server-string-to-date-conversion –

+0

pokrewne: http://stackoverflow.com/a/267016/327074 – icc97

Odpowiedz

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

Dzięki za tonę! Nie wiedziałem, że 0 oznacza 1900-01-01 00: 00: 00.000. –

4

Można użyć następujących zamiast:

DECLARE @day int, @month int, @year int 
SELECT @day = 4, @month = 3, @year = 2011 

SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1) 

To daje datę (choć prawdą jest, że SQL 2012 dobrze to nareszcie!)

Aby użyć go, gdy masz rok, dzień roku i godzinę, użyj następującego:

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

I nie masz miesiąca ani dnia miesiąca. Mam tylko Rok, dzień roku i godzinę dnia. –

+0

Zaktualizowałem, aby korzystać z dostępnych pól, które prawdopodobnie można skrócić, ale mimo to działa! – KaraokeStu

0

Oto alternatywne rozwiązanie:

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 

Koncepcja jest dodanie godziny do tej pory przy użyciu roku jako (rok - 1900) * 12, co miesiąc, począwszy od liczby dni.

2

Stworzyłem to dla siebie i uważałem, że będzie to dobre miejsce do udostępniania - bazuje na próbce Mikaela Erikssona.

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