Vergleichen Sie ein Datum string in datetime in SQL Server?
-
08-06-2019 - |
Frage
In SQL Server habe ich eine DATETIME
Spalte, die enthält ein Zeit-element.
Beispiel:
'14 AUG 2008 14:23:019'
Was ist das beste - Methode wählen nur die Einträge für einen bestimmten Tag, ungeachtet der Zeit Teil?
Beispiel:(Nicht sicher, da es nicht mit der Zeit Teil und keine Zeilen zurückgegeben werden)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
Hinweis:Angesichts dieser Ort ist auch über notieren Sie Notizen und Techniken, die Sie abholen, und dann vergessen, ich werde die post meine eigene Antwort auf diese Frage als DATETIME-Zeug in MSSQL ist wahrscheinlich das Thema, das ich lookup meisten in SQLBOL.
Update Geklärt Beispiel um genauer zu sein.
Bearbeiten Sorry, Aber ich habe down-mod FALSCHEN Antworten (Antworten, die falsche Ergebnisse).
@Jorrit: WHERE (date>'20080813' AND date<'20080815')
Rückkehr der 13 und der 14.
@wearejimbo: Schließen, aber keine Zigarre! Abzeichen an Sie vergeben.Sie verpasste Aufzeichnungen, geschrieben am 14.08.2008 23:59:001 bis 23:59:999 (d.h.Weniger als 1 Sekunde vor Mitternacht.)
Lösung
Technik 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)
Dies hat den Vorteil, dass jeder index auf 'column_datetime" wenn es existiert.
Andere Tipps
In SQL Server 2008 können Sie die neuen Datentyp DATE
DECLARE @pDate DATE='2008-08-14'
SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate
@Guy.Ich glaube, Sie werden feststellen, dass diese Lösung skaliert gut.Haben Sie einen Blick auf die query execution plan der ursprünglichen Abfrage.
Und für mine:
Vergleichen Sie einfach Jahr, Monat und Tag-Werte.
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)
So etwas wie dies?
SELECT *
FROM table1
WHERE convert(varchar, column_datetime, 111) = '2008/08/14'
Technik 2:
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 die column_datetime Feld ist nicht indiziert, und es ist unwahrscheinlich zu sein (oder der index ist kaum benutzt), dann mit DATEDIFF() kürzer ist.
Guter Punkt, um den index in die Antwort, die Sie akzeptiert.
Dennoch, wenn Sie wirklich Suche nur auf bestimmten DATE
oder DATE ranges
oft, dann ist die beste Lösung, die ich fand, ist das hinzufügen von anderen permanente berechnete Spalte zu Ihrer Tabelle die würde nur enthalten die DATE
, und fügen Sie index auf dieser Spalte:
ALTER TABLE "table1"
ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED
Add index für diese Spalte:
CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON "table1" ( "column_date" ASC )
GO
Dann wird Ihre Suche noch schneller:
DECLARE @p_date DATE
SET @p_date = CONVERT( DATE, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_date = @p_date
Diese Funktion Cast(Floor(Cast(GetDate() As Float)) As DateTime) gibt einen datetime-Datentyp mit der Zeit Teil entfernt und kann verwendet werden als so.
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
Wie man den DATE-Teil des DATETIME-Feld in MS SQL Server:
Eine der schnellsten und saubersten Möglichkeiten, dies zu tun, ist die Verwendung
DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)
Es vermeidet die CPU-busting "konvertieren Sie das Datum in eine Zeichenfolge ohne die Zeit und dann konvertieren Sie es wieder zurück" - Logik.
Es ist auch nicht zu setzen die interne Implementierung, die das "time" - Teil ist, ausgedrückt als ein Bruchteil" von dem Datum.
Holen Sie sich das Datum des ersten Tages des Monats
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))
Ich normalerweise zu konvertieren Datum-Zeit und vergleichen Sie, 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
Ich weiß, das ist nicht genau, wie Sie dies tun möchten, aber es könnte ein Anfang:
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'
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
Dieser wandelt die datatime und den string in varchars, die im format "YYYY-MM-DD".
Das ist sehr hässlich, aber sollte funktionieren
Datum verglichen werden kann, in SQL Server verwenden von string-Vergleich:z.B.
DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
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
Der beste Weg ist, extrahieren Sie einfach das Datum zum Teil mit der SQL-Funktion DATE ():
SELECT *
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) +
'/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) +
'/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
Es gibt viele Formate für Datum in SQL, die angegeben wird.Finden https://msdn.microsoft.com/en-in/library/ms187928.aspx
Konvertieren und vergleichen von varchar-Spalte mit der ausgewählten Termine.
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
In sqlserver
DECLARE @p_date DATE
SELECT *
FROM table1
WHERE column_dateTime=@p_date
In C# Pass die Kurzform des Datums Wert mit ToShortDateString () - Funktion.Beispiel:DateVariable.ToShortDateString();