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.)

War es hilfreich?

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();

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top