2008-08-14 16 views
37

In SQL Server habe ich eine Spalte, die ein Zeitelement enthält.Vergleichen Sie eine Datumszeichenfolge mit Datetime in SQL Server?

Beispiel:

'14 AUG 2008 14:23:019' 

Was ist die beste Methode, um nur die Datensätze für einen bestimmten Tag zu wählen, die Zeit Teil zu ignorieren?

Beispiel: (Nicht sicher, da es nicht die Zeit Teil und kehrt überein keine Zeilen)

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime = @p_date 

Hinweis: Da diese Seite ist auch über Notizen und Techniken notieren Sie abholen und dann vergessen Ich werde meine eigene Antwort auf diese Frage als DATETIME Zeug in MSSQL ist wahrscheinlich das Thema, das ich am meisten in SQLBOL nachschlagen.


aktualisieren Geklärte Beispiel genauer zu sein.


bearbeiten Sorry, aber ich habe mit Down-mod falsche Antworten (Antworten, die falsche Ergebnisse angezeigt) hatte.

@Jorrit: WHERE (date>'20080813' AND date<'20080815') werden die 13. und 14. zurückgeben.

@wearejimbo: Schließen, aber keine Zigarre! Abzeichen für Sie vergeben. Sie verpasste schriftlichen Aufzeichnungen 14.08.2008 23: 59: 001-23: 59: (. Dh weniger als 1 Sekunde vor Mitternacht) 999

Antwort

35

Technique 1:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime >= @p_date 
AND  column_datetime < DATEADD(d, 1, @p_date) 

Der Vorteil dieser ist, dass es einen beliebigen Index für 'column_datetime' verwenden wird, wenn es existiert.

+11

Ich glaube, dass CAST ('14 August 2008' als Datum-) ist etwas besser. Ich denke, es ist ein wenig lesbarer und ich glaube, dass CAST portabler ist als CONVERT(), da CAST() mit ANSI SQL-92 und -99 kompatibel ist. –

+1

Sie können das BETWEEN-Schlüsselwort als Kurzform zu dieser Antwort verwenden. –

+1

@BorhanMooz, tatsächlich, die BETWEEN erfasst nicht die> =/ NargothBond

1
SELECT * 
FROM table1 
WHERE CONVERT(varchar(10),columnDatetime,121) = 
     CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121) 

Dies wird die Datatime und die Zeichenfolge in Varchars des Formats "YYYY-MM-DD" umwandeln.

Das ist sehr hässlich, aber sollte

4

Technik 2 arbeiten:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE DATEDIFF(d, column_datetime, @p_date) = 0 

Wenn das column_datetime Feld nicht indiziert ist, und es ist unwahrscheinlich zu sein (oder der Index ist unwahrscheinlich, verwendet werden), dann Die Verwendung von DATEDIFF() ist kürzer.

8

Vergleichen Sie einfach die Werte für Jahr, Monat und Tag.

Declare @DateToSearch DateTime 
Set @DateToSearch = '14 AUG 2008' 

SELECT * 
FROM table1 
WHERE Year(column_datetime) = Year(@DateToSearch) 
     AND Month(column_datetime) = Month(@DateToSearch) 
     AND Day(column_datetime) = Day(@DateToSearch) 
3

Diese Funktion Guss (Floor (CAST (GetDate() As Float)) als Datum-) DATETIME-Datentyp mit dem Zeitabschnitt zurückgibt entfernt und könnte als so verwendet werden.

Select 
* 
Table1 
Where 
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008' 

oder

DECLARE @p_date DATETIME 
SET  @p_date = Cast('14 AUG 2008' as DateTime) 

SELECT * 
FROM  table1 
WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date 
+0

Werden die auf das Feld angewendeten Mehrfachfunktionen (falls indiziert) nicht in einen vollständigen Tabellenscan konvertiert? –

1

Ich weiß nicht genau, wie Sie dies tun wollen, aber es könnte ein Anfang sein:

SELECT * 
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
     DATEPART(mm, column_dateTime) as Month, 
     DATEPART(dd, column_dateTime) as Day 
     FROM table1) 
WHERE Year = '2008' 
AND Month = '8' 
AND Day = '14' 
4

So etwas wie das?

SELECT * 
FROM table1 
WHERE convert(varchar, column_datetime, 111) = '2008/08/14' 
14

In SQL Server 2008 können Sie den neuen Datentyp DATE

DECLARE @pDate DATE='2008-08-14' 

SELECT colA, colB 
FROM table1 
WHERE convert(date, colDateTime) = @pDate 

@Guy verwenden. Ich denke, Sie werden feststellen, dass diese Lösung gut skaliert. Werfen Sie einen Blick auf die query execution plan Ihrer ursprünglichen Abfrage.

Und für mine:

3

, wie das Datum Teil eines DATETIME- Feldes in MS SQL Server erhalten:

eine der schnellsten und saubersten Möglichkeiten, dies zu tun, ist mit

DATEADD(dd, DATEDIFF(dd, 0, @DAY), 0) 

Es vermeidet die CPU-Zerschlagung "Konvertieren Sie das Datum in eine Zeichenfolge ohne die Zeit und dann wieder zurück" Logik.

Es stellt auch die interne Implementierung nicht dar, dass der "Zeitabschnitt als Bruchteil" des Datums ausgedrückt wird.

DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0) 

Holen Sie sich das Datum rfom vor 1 Jahr

DATEADD(m,-12,DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0)) 
0
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp 
1
DECLARE @Dat 

SELECT * 
FROM Jai 
WHERE                           
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                
      CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+    
        CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat 
4

Guten Punkt über den Index

das Datum des ersten Tages der Monate Get in der Antwort hast du akzeptiert.

Dennoch, wenn Sie wirklich nur auf bestimmten DATE oder DATE rangesoft suchen, dann ist die beste Lösung, die ich gefunden ist eine andere beharrte berechnete Spalte zu Ihrer Tabelle hinzuzufügen, die nur die DATE enthalten würde, und fügen Index auf dieser Spalte:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED 

Add-Index auf dieser Spalte:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci" 
ON "table1" ("column_date" ASC) 
GO 

Dann wird die Suche schneller sogar:

DECLARE @p_date DATE 
SET  @p_date = CONVERT(DATE, '14 AUG 2008', 106) 

SELECT * 
FROM  table1 
WHERE column_date = @p_date 
+0

und dann schlage ich vor, eines der ISO-Formate für Daten zu verwenden, die die meisten Datenbanken erkennen und nicht abhängig von Sprache/Gebietsschema sind, wie 'YYYY-MM-DD' – van

-1

In Sqlserver

DECLARE @p_date DATE 

SELECT * 
FROM table1 
WHERE [email protected]_date 

In C# Pass die kurze Kette von Datumswert unter Verwendung ToShortDateString() Funktion. Beispiel: DateVariable.ToShortDateString();

1

Datum kann in SQL Server mit Zeichenfolgenvergleich verglichen werden: z.

DECLARE @strDate VARCHAR(15) 
SET @strDate ='07-12-2010' 


SELECT * FROM table 
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112) 
0
SELECT * FROM tablename 
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012' 
3

ich normalerweise Datum-Zeit auf dem neuesten Stand konvertieren und sie vergleichen zu können, wie diese:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date) 

oder

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0 
0

Der beste Weg, das Datum Teil einfach zu extrahieren Verwenden der SQL-Funktion DATE():

SELECT * 
FROM table1 
WHERE DATE(column_datetime) = @p_date; 
0

Es gibt viele Formate für Datum in SQL, die spezifiziert werden. Siehe https://msdn.microsoft.com/en-in/library/ms187928.aspx

Varchar-Spalte mit ausgewählten Daten konvertieren und vergleichen.

Syntax:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03' 
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy 
Verwandte Themen