2013-04-30 39 views
8

'da yıldan yıla, yıl ve saatten bir tarih alın. Bir dış kaynaktan gelen Microsft SQL Server 2008 R2'de bir tablom var. Aşağıdaki sütunlar ID, Year, DAY, HOUR & Value, DAY yılın gününü içerir (1'den 366'ya kadar) ve HOUR günün saatini temsil eder (0'dan 23'e kadar).SQL Server 2008 R2

Yeni bir datetime sütunu oluşturmak ve Year, DAY & HOUR sütunlarındaki verilerden oluşturulan dateTime ile doldurmak istiyorum.

Parçalarından DateTime oluşturmak için hangi SQL işlevini kullanmalıyım?

SQL Server 2012 DATETIMEFROMPARTS vardır, ama yerine aşağıdaki kullanabilirsiniz SQL Server 2008 R2

+0

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

+0

İlgili: http://stackoverflow.com/a/267016/327074 – icc97

cevap

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

Teşekkürler bir ton! 0'ın 1900-01-01 00: 00: 00.000 olduğunu bilmedim. –

4

için eşdeğer işlevi vardır: o 2012 SQL gerçek olsa (size tarih verecektir

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

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

: günün yılın ve saat gününü izleyen kullanmak doğru, nihayet alır) Eğer yıl varken

kullanmak için!

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

Ben Ayın veya ayın günü yok. Sadece Yıl, yılın günü ve günün saati var. –

+0

Büyük olasılıkla kısaltılabilecek mevcut alanlarınızı kullanmak için güncelledik ama yine de işe yarıyor! – KaraokeStu

0

İşte alternatif bir çözüm:

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 

kavram (yıl - 1900) olarak yılını kullanarak, bugüne kadar saat ekleyin sayısı ile başlayan ay olarak * 12 günler.

2

Bunu kendim için oluşturdum ve paylaşmanın iyi bir yer olacağını düşündüm - bu, Mikael Eriksson'un örneklemini temel alıyor.

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