web-dev-qa-db-de.com

Datum und Uhrzeit in einer Datumszeit zusammenfassen (verketten)

Bei Verwendung von SQL Server 2008 funktioniert diese Abfrage hervorragend:

select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME)
from field

Gibt mir zwei Spalten wie folgt:

2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
    .
    .
    .

Ich versuche, sie mithilfe des Pluszeichens in einer einzigen Datumszeit zu kombinieren:

select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME)
from field

Ich habe auf ungefähr zehn Websites nachgeschaut, einschließlich der Antworten auf dieser Website (wie hier ), und sie scheinen sich alle darin einig zu sein, dass das Pluszeichen funktionieren sollte, aber ich bekomme den Fehler:

Meldung 8117, Ebene 16, Status 1, Zeile 1
Datum des Datentyps des Operanden ist für den Operator "Hinzufügen" ungültig.

Alle Felder sind nicht Null und nicht Null. Ich habe auch die CONVERT-Funktion ausprobiert und versucht, diese Ergebnisse in Varchars umzuwandeln, dasselbe Problem. Das kann nicht so schwer sein, wie ich es schaffe.

Kann mir jemand sagen, warum das nicht funktioniert? Danke für jede Hilfe.

21
Stanton

Angenommen, die zugrunde liegenden Datentypen sind Datum/Uhrzeit/Datum/Uhrzeit usw.

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
  + ' ' + CONVERT(CHAR(8), CollectionTime, 108))
  FROM dbo.whatever;

Wenn nicht, WARUM NICHT , und um eine aussagekräftige Antwort zu erhalten, müssen Sie uns mitteilen, welche Typen Sie sind und in welchem ​​Format die Daten gespeichert sind. Oder reparieren Sie einfach die Tabelle.

38
Aaron Bertrand

Setzen Sie es stattdessen in datetime um:

select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME)
from field

Dies funktioniert auf SQL Server 2008 R2.

Wenn Sie aus irgendeinem Grund sicherstellen wollten, dass der erste Teil keine Zeitkomponente hat, wandeln Sie das Feld zuerst auf das Datum und dann zurück auf datetime.

9
Amy

Eine einfachere Lösung (getestet auf SQL Server 2014 SP1 CU6) 

Code: 

DECLARE @Date date = SYSDATETIME();

DECLARE @Time time(0) = SYSDATETIME();

SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0));

Dies würde auch bei einer Tabelle mit einem bestimmten Datum und einem bestimmten Zeitfeld funktionieren. Ich verwende diese Methode häufig, da wir Lieferantendaten haben, die Datum und Uhrzeit in zwei separaten Feldern verwenden.

6
texasrebelaggie

Die einfache Lösung

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME)
FROM field
5
Park Keeper
DECLARE @ADate Date, @ATime Time, @ADateTime Datetime

SELECT @ADate = '2010-02-20', @ATime = '18:53:00.0000000'

SET @ADateTime = CAST   (
    CONVERT(Varchar(10), @ADate, 112) + ' ' +   
    CONVERT(Varchar(8), @ATime) AS DateTime)

SELECT @ADateTime [A Nice datetime :)]

Dadurch erhalten Sie ein gültiges Ergebnis.

1
Elken
drop table test

create table test(
    CollectionDate date NULL,
    CollectionTime  [time](0) NULL,
    CollectionDateTime as (isnull(convert(datetime,CollectionDate)+convert(datetime,CollectionTime),CollectionDate))
-- if CollectionDate is datetime no need to convert it above
)

insert test (CollectionDate, CollectionTime)
values ('2013-12-10', '22:51:19.227'),
       ('2013-12-10', null),
       (null, '22:51:19.227')

select * from test

CollectionDate  CollectionTime  CollectionDateTime
2013-12-10      22:51:19        2013-12-10 22:51:19.000
2013-12-10      NULL            2013-12-10 00:00:00.000
NULL            22:51:19        NULL
0
dinok

Dies funktioniert in SQL 2008 und 2012, um datetime2 zu erzeugen:

declare @date date = current_timestamp;
declare @time time = current_timestamp;

select 
@date as date
,@time as time
,cast(@date as datetime) + cast(@time as datetime) as datetime
,cast(@time as datetime2) as timeAsDateTime2
,dateadd(dayofyear,datepart(dayofyear,@date) - 1,dateadd(year,datepart(year,@date) - 1900,cast(@time as datetime2))) as datetime2;
0
same

bei Datumsangaben muss dateadd für die Genauigkeit verwendet werden

declare @a DATE = getdate()
declare @b time(7) = getdate()
select @b, @A, GETDATE(), DATEADD(day, DATEDIFF(day, 0, @a), cast(@b as datetime2(0)))
0
Gaurav Aote

Ich verwende SQL Server 2016 und beide Felder myDate und myTime sind Zeichenfolgen. Die folgende tsql-Anweisung hat beim Verketten zu datetime funktioniert.

select cast((myDate + ' ' + myTime) as datetime) from myTable
0