Een datumstring vergelijken met datetime in SQL Server?

In SQL Server heb ik een kolom DATETIMEdie een tijdselement bevat.

Voorbeeld:

'14 AUG 2008 14:23:019'

Wat is de bestemethode om alleen de records voor een bepaalde dag te selecteren en het tijdsgedeelte te negeren?

Voorbeeld: (niet veilig, omdat het niet overeenkomt met het tijdsgedeelte en geen rijen retourneert)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM   table1
WHERE  column_datetime = @p_date

Opmerking: aangezien deze site ook gaat over het noteren van notities en technieken die je oppikt en vervolgens vergeet, ga ik mijn eigen antwoord op deze vraag posten, aangezien DATETIME-dingen in MSSQL waarschijnlijk het onderwerp zijn dat ik het meest zoek in SQLBOL.


UpdateVoorbeeld verduidelijkt om specifieker te zijn.


BewerkenSorry, maar ik moest VERKEERDE antwoorden downmodden (antwoorden die verkeerde resultaten opleveren).

@Jorrit: WHERE (date>'20080813' AND date<'20080815')retourneert de 13e en de 14e.

@wearejimbo: Sluit, maar geen sigaar!badge aan jou toegekend. U heeft records gemist die zijn geschreven op 14/08/2008 23:59:001 tot 23:59:999 (d.w.z. minder dan 1 seconde voor middernacht.)


Antwoord 1, autoriteit 100%

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

Het voordeel hiervan is dat het elke index op ‘column_datetime’ zal gebruiken als deze bestaat.


Antwoord 2, autoriteit 53%

In SQL Server 2008 zou u het nieuwe datatype DATE kunnen gebruiken

DECLARE @pDate DATE='2008-08-14'  
SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@Guy. Ik denk dat je zult merken dat deze oplossing prima schaalt. Bekijk het plan voor het uitvoeren van query’svan uw originele vraag.

En voor mijn:


Antwoord 3, autoriteit 21%

Vergelijk gewoon de jaar-, maand- en dagwaarden.

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)

Antwoord 4, autoriteit 11%

Zoiets?

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

Antwoord 5, autoriteit 11%

Techniek 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

Als het veld column_datetime niet is geïndexeerd en het onwaarschijnlijk is dat dit het geval is (of de index zal waarschijnlijk niet worden gebruikt), is het gebruik van DATEDIFF() korter.


Antwoord 6, autoriteit 11%

Goed punt over de index in het antwoord dat je hebt geaccepteerd.

Toch, als je echt alleen zoekt op specifieke DATEof DATE rangesvaak, dan is de beste oplossing die ik heb gevonden, een andere persistente berekende kolom naar uw tabel die alleen de DATEzou bevatten, en voeg een index toe aan deze kolom:

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

Voeg index toe aan die kolom:

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

Dan gaat je zoekopdracht nog sneller:

DECLARE  @p_date DATE
SET      @p_date = CONVERT( DATE, '14 AUG 2008', 106 )
SELECT   *
FROM     table1
WHERE    column_date = @p_date

Antwoord 7, autoriteit 11%

Normaal gesproken converteer ik datum-tijd naar datum en vergelijk ze, zoals deze:

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

of

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

Antwoord 8, autoriteit 8%

Deze functie Cast(Floor(Cast(GetDate() As Floating)) As DateTime)retourneert een datetime datatype waarbij het tijdgedeelte is verwijderd en dat als zodanig kan worden gebruikt.

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

of

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

Antwoord 9, autoriteit 8%

Hoe het DATE-gedeelte van een DATETIME-veld in MS SQL Server te krijgen:

Een van de snelste en handigste manieren om dit te doen, is met

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

Het vermijdt de CPU-busting “converteer de datum in een string zonder de tijd en converteer het dan weer terug”-logica.

Het onthult ook niet de interne implementatie dat het “tijdsgedeelte wordt uitgedrukt als een fractie” van de datum.

Krijg de datum van de eerste dag van de maand

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

Krijg de datum van 1 jaar geleden

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

Antwoord 10, autoriteit 3%

Ik weet dat dit niet precies is hoe je dit wilt doen, maar het kan een begin zijn:

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'

Antwoord 11, autoriteit 3%

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

Hiermee worden de datatime en de string geconverteerd naar varchars met het formaat “JJJJ-MM-DD”.

Dit is erg lelijk, maar zou moeten werken


Antwoord 12, autoriteit 3%

Datum kan worden vergeleken in sqlserver met behulp van stringvergelijking:
bijv.

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)

Antwoord 13, autoriteit 3%

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

Antwoord 14

De beste manier is om eenvoudig het datumdeel te extraheren met behulp van de functie SQL DATUM ():

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

Antwoord 15

SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'

Antwoord 16

SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

Antwoord 17

Er zijn veel indelingen voor datum in SQL die worden opgegeven. Verwijs https://msdn.microsoft.com/en-in/library/ms187928. aspx

VARCHAR-kolom converteren en vergelijken met geselecteerde data.

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

Antwoord 18

in SQLSERVER

DECLARE @p_date DATE
SELECT * 
FROM table1
WHERE column_dateTime=@p_date

in c #
Passeer de korte reeks datumwaarde met behulp van ToshortDatestring () -functie.
steekproef:
DATEVARIBIERE.TOSHORTDATESTRING ();

Other episodes