2013-04-30 5 views
8

Ho una tabella in un microsft SQL Server 2008 R2, proveniente da una fonte esterna. Le colonne sono le seguenti: ID, Year, DAY, HOUR & Value, dove DAY contiene il giorno dell'anno (da 1 a 366) e HOUR rappresenta l'ora del giorno (da 0 a 23).Ottenere un datetime dall'anno, dal giorno dell'anno e dall'ora in SQL Server 2008 R2

Desidero creare una nuova colonna datetime e completarla con la dataTime creata dai dati nelle colonne Year, DAY & HOUR.

Quale funzione SQL devo utilizzare per creare il DateTime dalle sue parti?

SQL Server 2012 ha DATETIMEFROMPARTS, ma non esiste una funzione equivalente per SQL Server 2008 R2

+0

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

+0

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

risposta

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

Grazie mille! Non sapevo che 0 rappresentasse il 1900-01-01 00: 00: 00.000. –

4

È possibile utilizzare il seguente invece:

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

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

che vi darà la data (anche se è vero che SQL 2012 ! ottiene di destra, finalmente)

Per usarlo quando si dispone di anno, i giorni dell'anno e ora del giorno, utilizzare il seguente:

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 non avere il mese o il giorno del mese. Ho solo l'anno, il giorno dell'anno e l'ora del giorno. –

+0

Ho aggiornato per utilizzare i campi disponibili, che potrebbero probabilmente essere abbreviati, ma funziona comunque! – KaraokeStu

0

Ecco una soluzione alternativa:

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 

Il concetto è aggiungere le ore per la data, utilizzando l'anno come (anno - 1900) * 12 come il mese, a partire dal numero di giorni.

2

L'ho creato per me e ho pensato che sarebbe stato un buon posto per condividere - è basato sul campione di 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 
Problemi correlati