In einem Auszug, mit dem ich es zu tun habe, habe ich 2 datetime
Spalten. In einer Spalte werden die Daten und in der anderen die angezeigten Zeiten gespeichert.
Wie kann ich die Tabelle abfragen, um diese beiden Felder in einer Spalte vom Typ datetime
zu kombinieren?
Termine
2009-03-12 00:00:00.000
2009-03-26 00:00:00.000
2009-03-26 00:00:00.000
Zeiten
1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000
Sie können die beiden einfach hinzufügen.
Time part
Ihrer Date
-Spalte ist immer Null Date part
Ihrer Time
-Spalte ist auch immer null (Basisdatum: 1. Januar 1900)Wenn Sie sie hinzufügen, wird das korrekte Ergebnis zurückgegeben.
SELECT Combined = MyDate + MyTime FROM MyTable
It works like this due to the way the date is stored as two 4-byte `Integers` with the
left 4-bytes being the `date` and the right 4-bytes being the `time`.
Its like doing $0001 0000 + $0000 0001 = $0001 0001
Date
und Time
sind in SQL Server 2008
eingeführte Typen. Wenn Sie darauf bestehen, hinzuzufügen, können Sie Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)
verwenden.
Werfen Sie einen Blick auf Wie Datum und Uhrzeit in SQL Server mit datetime2 kombinieren? um Präzisionsverluste bei SQL Server 2008 und höher zu vermeiden.
Wenn das Zeitelement Ihrer Datumsspalte und das Datumselement Ihrer Zeitspalte beide Null sind, benötigen Sie Lieven's answer Wenn Sie nicht garantieren können, dass dies immer der Fall ist, wird es etwas komplizierter:
SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) +
DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column)
FROM your_table
Dies ist eine alternative Lösung ohne Zeichenumwandlung:
DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))
Sie erhalten auf diese Weise nur Millisekunden-Genauigkeit, aber das wäre normalerweise in Ordnung. Ich habe dies in SQL Server 2008 getestet.
Das hat bei mir funktioniert
CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)
(unter SQL 2008 R2)
Wenn beide Felder datetime sind, funktioniert das Hinzufügen einfach.
z.B:
Declare @d datetime, @t datetime
set @d = '2009-03-12 00:00:00.000';
set @t = '1899-12-30 12:30:00.000';
select @d + @t
Wenn Sie den Datums- und Zeitdatentyp verwendet haben, wandeln Sie einfach die Uhrzeit in die Datumszeit um
z.B:
Declare @d date, @t time
set @d = '2009-03-12';
set @t = '12:30:00.000';
select @d + cast(@t as datetime)
Wenn Sie nicht SQL Server 2008 verwenden (d. H. Sie haben nur einen DateTime-Datentyp), können Sie die folgende (zugegebenermaßen grobe und fertige) TSQL verwenden, um das zu erreichen, was Sie möchten:
DECLARE @DateOnly AS datetime
DECLARE @TimeOnly AS datetime
SET @DateOnly = '07 aug 2009 00:00:00'
SET @TimeOnly = '01 jan 1899 10:11:23'
-- Gives Date Only.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly))
-- Gives Time Only.
SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)
-- Concatenates Date and Time parts.
SELECT
CAST(
DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' +
DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)
as datetime)
Es ist rau und fertig, aber es funktioniert!
Konvertieren Sie das erste Datum, das in einem Datums-/Uhrzeitfeld gespeichert ist, in eine Zeichenfolge. Konvertieren Sie dann die in einem Datums-/Uhrzeitfeld gespeicherte Uhrzeit in eine Zeichenfolge. Hängen Sie die beiden an und konvertieren Sie sie zurück in ein Datums-/Uhrzeitfeld. Dabei werden bekannte Konvertierungsformate verwendet.
Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103)
Konvertieren Sie beide Felder in DATETIME:
SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME)
und wenn Sie Getdate()
verwenden, verwenden Sie diese zuerst:
DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE());
SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table
Klappt wunderbar
DECLARE @Dates table ([Date] datetime);
DECLARE @Times table ([Time] datetime);
INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 12:30:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
WITH Dates (ID, [Date])
AS (
SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates
), Times (ID, [Time])
AS (
SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times
)
SELECT Dates.[Date] + Times.[Time] FROM Dates
JOIN Times ON Times.ID = Dates.ID
Drucke:
2009-03-12 10:00:00.000
2009-03-26 10:00:00.000
2009-03-30 12:30:00.000
Ich hatte viele Fehler, wie oben erwähnt, also habe ich es so gemacht
try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime
Es hat für mich funktioniert.
Eine andere Möglichkeit ist die Verwendung von CONCAT
und CAST
. Beachten Sie, dass Sie DATETIME2(x)
verwenden müssen, damit es funktioniert. Sie können x
auf einen beliebigen Wert zwischen 0-7
7
einstellen, der keinen Präzisionsverlust bedeutet.
DECLARE @date date = '2018-03-12'
DECLARE @time time = '07:00:00.0000000'
SELECT CAST(CONCAT(@date, ' ', @time) AS DATETIME2(7))
Gibt 2018-03-12 07:00:00.0000000
zurück
Getestet auf SQL Server 14