wake-up-neo.net

So kombinieren Sie das Datum aus einem Feld mit der Uhrzeit aus einem anderen Feld - MS SQL Server

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
177
Jon Winstanley

Sie können die beiden einfach hinzufügen.

  • if der Time part Ihrer Date-Spalte ist immer Null 
  • und der 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

Begründung (Kudos an ErikE/Dnolan)

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

Bearbeiten Sie neue SQL Server 2008-Typen

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.

Edit2 bezüglich Präzisionsverlust in SQL Server 2008 und höher (ein großes Lob an Martin Smith)

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.

233

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
125
LukeH

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.

21
Jojje

Das hat bei mir funktioniert

CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)

(unter SQL 2008 R2)

11
biso
  1. 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
    
  2. 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!

9
CraigTP

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) 
2
SPE109

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)
1
Alex Briones
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

Klappt wunderbar

1
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
1

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.

1
Tom

Eine andere Möglichkeit ist die Verwendung von CONCATund CAST. Beachten Sie, dass Sie DATETIME2(x) verwenden müssen, damit es funktioniert. Sie können x auf einen beliebigen Wert zwischen 0-77 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

0
LuckyLikey