Od wersji serwera SQL 2008 mamy do dyspozycji typ DATE i TIME i wiele innych zamiast jedynego do tej pory DATETIME. Typ DATE przechowuje datę (bez czasu) a typ TIME przechowuje czas (bez daty). Jednak jak połączyć to w całość, przypominającą dawny DATETIME (zawierający i datę i czas)?
Da się.
Zobacz ten skrypt:
1 |
DECLARE @time TIME = SYSDATETIME() |
1 |
DECLARE @date DATE = SYSDATETIME() |
1 |
DECLARE @datetime2 DATETIME2 = @time |
1 |
SELECT @time,@date,@datetime2 |
1 |
SELECT DATEADD(day, DATEDIFF(day, @datetime2, @date),@datetime2) |
Najpierw zadreklarowialiśmy zmienne typu TIME, DATE oraz DATETIME2. Przy czym @datetime2 przyjmuje wartość @time. Co za dziwne przyporządkowanie! Select poniżej prezentuje o co chodziło.
Teraz @datetime2 zawiera dobry czas, ale data jest niedobra… 1900-01-01.
W kolejnym więc kroku wyliczamy różnicę między aktualną wartością @datetime2, a datą zawartą w @date. Jest to instrukcja:
1 |
DATEDIFF(day, @datetime2, @date) |
Wartość jest wyliczana w dniach.Pozostaje tę liczbę dni dodać teraz do @datetime2, aby uzyskać to o co chodziło.
Oto nasze wyliczenie:
1 |
SELECT DATEADD(day, DATEDIFF(day, @datetime2, @date),@datetime2) |
a oto wynik:
Data i czas zostały sklejone!