2016-07-15 3 views
0

Ich versuche, datetime zu date konvertieren Funktion konvertieren. Aber es ist groß, da es riesige Daten in der Tabelle gibt.Wie konvertiert man Datetime zu Datum ohne Konvertierungsfunktion in SQL-Server

Gibt es eine andere Möglichkeit, dies ohne Konvertierungsfunktion in weniger Zeit zu tun.

Abfrage:

Select * 
from address 
where convert(date,record-created_date) between '6/29/2016' and '6/30/2016' 
+0

Regel besser, nur zu passen Sie Ihre Konstanten, so dass der Zeitabschnitt irrelevant ist. –

+0

Angenommen, Sie haben Ihre Pläne, Indizes usw. untersucht, lesen Sie diese http://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-but-is-it-a-good-idea –

+0

Welche Datentypen sind die beteiligten Spalten? –

Antwort

1

Mit 2008 SQL können Sie verwenden CAST:

select cast(record-created_date as date) 

In älteren Versionen können Sie DATEADD/DATEDIFF verwenden:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, record-created_date)) 
+1

Seien Sie vorsichtig, da 'CAST' meist sargable ist, 'DATEADD' ist meistens nicht. –

1

Sie 2 Konstanten definieren können in Erweitert, vermeiden Sie daher die Verwendung der Konvertierungsfunktion in der Spalte:

declare @min_date datetime 
declare @max_date datetime 

set @min_date = convert(datetime, '06/29/2016', 101) 

-- Max date needs to be the next date of your end date 
set @max_date = convert(datetime, '06/30/2016', 101) + 1 

Select * 
from address 
where record-created_date >= @min_date 
and record-created_date < @max_date 
1

einfach die Umwandlung auslassen und einen Tag zum Enddatum hinzufügen:

where record_created_date between '6/29/2016' and '7/1/2016' 

Dies als <= '7/1/2016 0:00' interpretiert wird, so diese kurze Form nur verwenden, wenn in Ordnung ist, dass Mitternacht des folgenden Tages enthalten ist . Ansonsten verwenden Sie die lange Form:

where record_created_date >= '6/29/2016' and record_created_date < '7/1/2016' 

... oder die Zeit hinzuzufügen.

where record_created_date between '6/29/2016' and '6/30/2016 23:59:59.999' 

Btw, ich denke, dass es besser ist, das Datumsformat ‚2016.06.29‘ zu verwenden, für die hartkodierte Termine.

Wie auch immer, der Hauptgrund für die Langsamkeit ist höchstwahrscheinlich ein fehlender Index für diese Spalte.

2

Sie können einfach CONVERT Funktion wie folgende Abfrage entfernen, so dass keine Zeit für die Umwandlung ausgegeben, aber stattdessen haben Sie Zeit, um Ihre [record-created_date] Spalte in der WHERE Klausel hinzuzufügen:

SELECT * 
FROM [address] 
WHERE [record-created_date] BETWEEN '6/29/2016 00:00:00:000' AND '6/30/2016 23:59:59:999' 
Verwandte Themen