2016-04-29 23 views
1

Ich habe eine Tabelle mit einem Datetimeoffset-Feld, das Primärschlüssel ist. Ich möchte meine Tabelle mit einer Datetime filtern.WÄHLEN Sie ein Datetimeoffset-Feld von Datetime

Zum Beispiel meiner Tabelle hat:

2016-04-27 23:30:00.7684500 +03:00 
2016-04-28 00:30:00.7684500 +03:00 

In Ortszeit Format, erste Reihe bedeutet 2016.04.29 02.30.00 und zweite Reihe bedeutet 2016.04.28 03.30.00. Ich meine zwei von ihnen in Datum: 2016-04-28.

Wenn ich Transaktionen im Datum 2016-04-28 melden wollte, bekomme ich nur die zweite Zeile.

declare @fromDate datetime 
select @fromDate = '2016-04-28 00:00:00' 
select * from MYTABLE where dto > @fromDate 

Da, sql UTC-Zeit in datetimeoffset Feld suchen.

kann ich bekommen, was ich will, wie das wirklich:

declare @fromDate datetime 
select @fromDate = '2016-04-28 00:00:00' 
select * from MYTABLE where CAST(dto as datetime) > @fromDate 

Erste und zweite Reihe comming sind.

Die Frage ist, dass ich Leistung für Casting verloren habe? System sucht und spielt jede Zeile (sequentielles Lesen), auch wenn dto der Primärschlüssel ist?

Gibt es einen besseren Weg?

Vielen Dank ...

+0

Tag die dbms verwendet. (Dieser Code sieht nicht wie ANSI SQL aus ...) – jarlh

+0

Vielen Dank. Es ist MS SQL Server 2014. –

Antwort

0

Absolut ... Ich würde empfehlen, ein berechnetes Feld der Tabelle hinzugefügt wird. Auf diese Weise findet die Konvertierung automatisch in SQL statt und CAST oder CONVERT werden in der Abfrage nicht benötigt. Führen Sie eine Suche auf Berechnetes Feld und geben Sie Ihren Code

CONVERT(DATETIME, dto, 109) 

oder

TRY_CONVERT(DATETIME, dto, 109) 

Ich würde verwenden TRY_CONVERT wie Sie speziell das Format des Datetime für Ihr neues berechnetes Feld und wenn aus irgendeinem Grund eingestellt werden, dto ist kein gültiges Datum, es wird NULL anstelle von fehlgeschlagen eingefügt.

1

Wenn Ihr Offset (3) eine Konstante ist, können Sie dies versuchen:

declare @fromDate datetime 
select @fromDate = '2016-04-28 00:00:00' 
select * from MYTABLE where dateadd(hour, 3, dto) > @fromDate 

Oder Sie können TODATETIMEOFFSET

wie folgt verwendet werden:

select * from MYTABLE where TODATETIMEOFFSET(dto, '03:00') > @fromDate