2009-12-17 10 views
38

Powiel możliwe:
Create a date with T-SQLSQL Server: konwersja ((int) lat, (int) miesięcy, (int) dni), aby DateTime

Mam tabelę danych, która przechowuje każdy rok, miesiąc i dzień wartość jako wskazówki:

year | month | day 
2009 | 1 | 1 
2008 | 12 | 2 
2007 | 5 | 5 

muszę konwertować je do wartości datetime, bo muszę go używać w datetime między operacji. Jak mogłem to zrobić?

+0

ten został poproszony kilka razy. Zobacz http://stackoverflow.com/questions/266924/create-a-date-with-t-sql – womp

Odpowiedz

64

Aby być niezależne od ustawień języka i lokalizacji, należy użyć YYYYMMDD jest format ISO 8601 - to będzie działać na każdym systemie SQL Server z dowolnego języka i ustawień regionalnych w życie:

SELECT 
    CAST(
     CAST(year AS VARCHAR(4)) + 
     RIGHT('0' + CAST(month AS VARCHAR(2)), 2) + 
     RIGHT('0' + CAST(day AS VARCHAR(2)), 2) 
    AS DATETIME) 
+0

dziękuję, zrobiłem to w ten sposób. – balint

+1

YYYYMMDD działa jak magia! – LaBracca

+0

Nie działa z Firebird 2.5, ale tylko 'RRRR-MM-DD' ma wartość – Fr0sT

2
SELECT CAST(CAST(year AS varchar) + '/' + CAST(month AS varchar) + '/' + CAST(day as varchar) AS datetime) AS MyDateTime 
FROM table 
+4

to zły pomysł - zależy to od lokalnych ustawień formatu daty. –

+1

@marc_s zrozumiał, ale w zależności od potrzeb związanych z wdrażaniem może to być punkt ignorowania. –

+2

naw. Jeśli jest to jednorazowe zapytanie ad-hoc, mogę zobaczyć twój punkt widzenia. Ale nie w procedurze przechowywanej. marc_s ma dobry punkt! – TamusJRoyce

7

można konwertować wartości w datetime a „po przecinku”, a następnie przekształcić go do prawdziwego kolumny datetime:

select cast(rtrim(year *10000+ month *100+ day) as datetime) as Date from DateTable 

Zobacz here oraz więcej informacji.

+0

To jest najlepsza odpowiedź –

36

Czysta rozwiązanie datetime, nie zależy od języka lub DATEFORMAT, bez żadnych

SELECT 
    DATEADD(year, [year]-1900, DATEADD(month, [month]-1, DATEADD(day, [day]-1, 0))) 
FROM 
    dbo.Table 
+0

To wymaga, aby SQL był skonfigurowany z 1900 jako datą podstawową, ale –

+0

@AdriaanDavel SQL Server (tagi pytań) to * zawsze * data bazowa 01 stycznia 1900 . https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql zobacz "wartość domyślna". – gbn