2010-05-25 2 views
6

logparser Verwenden der IIS-Protokolle auf ein DB-Ergebnisse in einer Spalte zu importieren, die den Datumswert und ein zweites Feld für Zeit hat:TSQL ein Datumsfeld zu kombinieren und ein Zeitfeld

2010-05-25 00:00:00.000 

und

2010-01-01 11:11:58.000 

Ich möchte einen after insert Trigger codieren, der die 2 Felder kombiniert.

Antwort

6

Falls jemand anderes in diesem Thread stolpert (oder falls das Original-Poster diese Antwort noch verwenden kann), sehen Sie in der LogParser die Funktion TO_TIMESTAMP (Datum, Uhrzeit), mit der Sie einen Nur-Datum-Zeitstempel mit einer Uhrzeit kombinieren können -nur Zeitstempel in einen vollständigen Zeitstempelwert ... und erspart Ihnen die Konvertierung in die Datenbank ...

18

Sie können einfach die beiden Werte nach dem Umwandeln in die Datentypen DATE und TIME hinzufügen, wenn Sie SQL Server 2008 oder höher verwenden. Hier ist ein Beispiel.

declare @datet datetime; 
set @datet = GETDATE(); 

select 
    @datet, 
    cast(@datet as date), 
    cast(@datet as time); 

select 
    cast(cast(@datet as date) as datetime), 
    cast(cast(@datet as time) as datetime), 
    cast(cast(@datet as date) as datetime) + cast(cast(@datet as time) as datetime); 
+0

Das Datum und die Uhrzeit als Datentypen scheint viel sauberer als das Ziehen von Positionen aus einer Zeichenfolge. Neu bei 08, sagst du. So hast du mich die ersten 9 Yards - ich kann alle Zeilen in der Tabelle aktualisieren - wie aktualisiere ich nur die eingefügten Zeilen - sieht aus wie mindestens ich sollte "INSERT BEFORE" statt nach THX – justSteve

+0

suchen Wenn Sie Vermeiden Sie den Trigger vollständig und fügen Sie der Tabelle stattdessen eine weitere Spalte als berechnete Spalte hinzu. Sie können dies tun, indem Sie eine s-Anweisung wie folgt verwenden: ALTER TABLE yurtable ADD DateAndTime (cast (cast (@datet als Datum) als datetime) + cast (cast (@datet als Zeit) als datetime)); –

+0

In meinem Fall hatte ich eine statische Zeit, die ich anheften wollte und war in der Lage, die innere Besetzung der Zeit zu vermeiden. So wirkt Cast (Cast_Date_col als Datum) wie Datetime + Cast ('11: 59: 59 PM 'als Datetime) prächtig und war ein wenig prägnanter – jinglesthula

1

Try this:

DECLARE @Date varchar(23) 
     ,@Time varchar(23) 
     ,@Both datetime 

SELECT @Date='2010-05-25 00:00:00.000' 
     ,@Time='2010-01-01 11:11:58.000' 

SELECT @Both=LEFT(@Date,10)+' '+RIGHT(@Time,12) 

SELECT @Both 

OUTPUT:

----------------------- 
2010-05-25 11:11:58.000 

(1 row(s) affected) 

Set basiert:

DECLARE @INSERTED table(RowID int, DateOf varchar(23), TimeOf varchar(23), DateTimeOf datetime) 

INSERT @INSERTED VALUES (1,'2010-05-25 00:00:00.000','2010-01-01 11:11:58.000',null) 
INSERT @INSERTED VALUES (2,'2010-04-05 00:00:00.000','2010-01-01 12:34:56.789',null) 
INSERT @INSERTED VALUES (3,'2010-03-15 00:00:00.000','2010-01-01 01:01:01.000',null) 


UPDATE @INSERTED 
    SET DateTimeOf=LEFT(DateOf,10)+' '+RIGHT(TimeOf,12) 

SELECT * FROM @INSERTED 

OUTPUT:

RowID DateOf     TimeOf     DateTimeOf 
------- ----------------------- ----------------------- ----------------------- 
1  2010-05-25 00:00:00.000 2010-01-01 11:11:58.000 2010-05-25 11:11:58.000 
2  2010-04-05 00:00:00.000 2010-01-01 12:34:56.789 2010-04-05 12:34:56.790 
3  2010-03-15 00:00:00.000 2010-01-01 01:01:01.000 2010-03-15 01:01:01.000 

(3 row(s) affected) 
0

Wenn Sie die Ausgabe in eine neue Spalte hinzufügen können, können Sie diese neue Spalte auch als eine berechnete Spalte und definieren Sie sie, um diese 2 Spalten (zur Entwurfszeit) zu kombinieren.

Dev

Verwandte Themen