sql >> Databasteknik >  >> RDS >> Sqlserver

Jämför datum i T-SQL, ignorera tidsdelen

Det mest rimliga sättet att göra detta är att ta bort tidsdelen av datetime-värdena och jämföra resultaten, och det bästa sättet att ta bort tidsdelen från en datetime är så här:

cast(current_timestamp as date)    

Jag brukade använda och förespråka en process som såg ut som en av följande två rader:

cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))

Men nu när SQL Server har Date typ, som inte innehåller en tidskomponent, finns det ingen anledning att använda någon av dessa tekniker.

En sak till att komma ihåg är att detta fortfarande kommer att försvinna en fråga om du behöver göra det för två datetime-värden för varje rad i en where-sats eller join-villkor. Om möjligt vill du ta bort detta på något sätt så att det är förberäknat så mycket som möjligt, till exempel med hjälp av en vy eller beräknad kolumn.

Notera slutligen att DATEDIFF-funktionen jämför antalet gränser som passerats. Detta betyder datediff i dagar mellan '2009-09-14 11:59:59' och '2009-09-15 00:00:01' är 1, trots att bara 2 sekunder har gått, men DATEDIFF i dagar mellan '2009-09-15 00:00:01' och '2009-09-15 11:59:59' är fortfarande noll, trots att 86 398 sekunder har gått. Det bryr sig egentligen inte alls om tidsdelen där, bara gränserna. Beroende på vad din fråga försöker göra, kanske du kan använda det till din fördel.



  1. SQL IN Klausul 1000 objektgräns

  2. Hur kan SQL Workload Analysis hjälpa dig?

  3. Hur man inaktiverar alla kontrollbegränsningar i SQL Server Database - SQL Server / TSQL självstudie del 87

  4. Hur man ställer in standardspråket för alla nya inloggningar i SQL Server (T-SQL)