sql >> Databasteknik >  >> RDS >> Sqlserver

Bästa sättet att ta bort tid del av datetime i SQL Server

Strikt, metod a är den minst resurskrävande:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Bevisat mindre CPU-intensiv för samma totala varaktighet en miljon rader av någon med alldeles för mycket tid på sina händer:Det effektivaste sättet i SQL Server att få ett datum från datum+tid?

Jag såg ett liknande test någon annanstans med liknande resultat också.

Jag föredrar DATEADD/DATEDIFF eftersom:

  • varchar är föremål för språk-/datumformatproblem
    Exempel:Varför är mitt CASE-uttryck icke-deterministiskt?
  • float är beroende av intern lagring
  • det utökas till att träna första dagen i månaden, imorgon osv genom att ändra "0"-bas

Redigera, okt 2011

För SQL Server 2008+ kan du CAST till date dvs. CAST(getdate() AS date) . Eller använd bara date datatyp så ingen time att ta bort.

Redigera, jan 2012

Ett fungerande exempel på hur flexibelt detta är:Behov av att beräkna efter avrundad tid eller datumsiffra i sql-server

Redigera, maj 2012

Använd inte detta i WHERE-satser och liknande utan att tänka:att lägga till en funktion eller CAST i en kolumn ogiltigförklarar indexanvändningen. Se nummer 2 här Vanliga SQL-programmeringsmisstag

Nu har den här ett exempel på senare versioner av SQL Server-optimerare som hanterar CAST till dags dato korrekt, men allmänt det kommer att vara en dålig idé ...

Redigera, sep 2018, för datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)


  1. PostgreSQL Skapa databas

  2. Hur man identifierar ogiltiga (skadade) värden lagrade i Oracle DATE-kolumner

  3. Lista över språk som stöds av Oracle Database

  4. lastInsertId fungerar inte i Postgresql