2013-09-04 24 views
16

Verwendung von SQL Server 2008, diese Abfrage funktioniert super Kombination:(verketten) Datum und Uhrzeit in ein Datetime

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

gibt mir zwei Spalten wie folgt aus:

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 zu kombinieren bin versucht, sie zu einem einzigen Datetime mit dem Pluszeichen, wie folgt aus:

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

ich habe auf etwa zehn Websites sah, einschließlich Antworten o n dieser Stelle (wie this one), und sie scheinen alle einig, dass das Pluszeichen sollte funktionieren, aber ich bekomme die Fehlermeldung:

Msg 8117, Level 16, State 1, Line 1
Operand data type date is invalid for add operator.

Alle Felder sind ungleich Null und ungleich Null. Ich habe auch versucht, die CONVERT-Funktion und versuchte, diese Ergebnisse als varchars, das gleiche Problem zu werfen. Das kann nicht so schwer sein wie ich es mache.

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

+1

Was die ursprünglichen Datentypen für jede Spalte sind ?, und wenn sie Strings werden, wie sich die dort gespeicherten Daten? (YYYY-MM-TT, JJJJMMTT, usw.) – Lamak

+0

Frage eigentlich zu Ihnen und @Aaron Bertrand, wenn ich meine Daten in der Abfrage selbst CASTing (oder CONVERTING), spielt es eine Rolle, ob die zugrunde liegenden Daten gespeichert sind als Zeichenfolgen oder Daten? Ich speichere als Datetime-Felder, bin aber nur neugierig. – Stanton

+0

@Stanton sicher, es spielt eine Rolle. Warum solltest du zwei Ebenen von Cast/Convert durchlaufen, wenn du das nicht brauchst? –

Antwort

30

die zugrunde liegenden Datentypen Unter der Annahme, sind Datum/Zeit/Datumzeit usw.

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

Wenn sie es nicht sind, WARUM NICHT und Um eine sinnvolle Antwort zu erhalten, müssen Sie uns mitteilen, um welche Typen es sich handelt und in welchem ​​Format die Daten gespeichert sind. Oder reparieren Sie einfach die Tabelle.

+0

Aaron, danke für Ihre Antwort, und Einblick in meine Follow-up-Frage oben wäre willkommen. – Stanton

+0

Funktioniert für sql-server-2012. Nice Job – FirebladeDan

-4

Verwenden Concat die Mysql hat diese Funktion

+0

Aber das ist für SQL Server – Lamak

+0

Versucht, dass, funktioniert nicht mit MS SQL 2008. – Stanton

+0

Es würde nicht. Concat ist eine String-Funktion. – Amy

7

Guss es datetime statt:

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

Dies funktioniert auf SQL Server 2008 R2.

Wenn Sie aus irgendeinem Grund sicherstellen möchten, dass der erste Teil keine Zeitkomponente aufweist, erst das Feld auf das Datum und dann zurück auf datetime umwandeln.

+2

'Msg 402, Ebene 16, Status 1, Zeile 1 - Die Datentypen datetime und time sind beim add-Operator nicht kompatibel. ' –

+0

Bullseye! Vielen Dank! – Stanton

+0

@AaronBertrand, welche Version von SQL Server verwenden Sie? – Amy

1
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 :)] 

Dies wird Ihnen ein gültiges Ergebnis rendern.

0
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

Das in SQL 2008 und 2012 arbeitet produzieren datetime2:

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; 
-1
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), date, 112) + ' ' + CONVERT(CHAR(8), time, 108)) 
    FROM tablename 
5

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 funktionieren, wenn eine Tabelle mit einem sp Datum und ein spezifisches Zeitfeld. Ich verwende diese Methode häufig, da wir Lieferantendaten haben, die Datum und Uhrzeit in zwei getrennten Feldern verwenden.

3

Die einfache Lösung

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME) 
FROM field