sql >> Database >  >> RDS >> Sqlserver

Beste aanpak om tijdgedeelte van datetime in SQL Server te verwijderen

Strikt genomen, methode a is het minst arbeidsintensief:

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

Bewezen minder CPU-intensief voor dezelfde totale duur van een miljoen rijen door iemand met veel te veel tijd:de meest efficiënte manier in SQL Server om een ​​datum van datum+tijd te krijgen?

Ik zag elders een vergelijkbare test met vergelijkbare resultaten.

Ik geef de voorkeur aan de DATEADD/DATEDIFF omdat:

  • varchar is onderhevig aan problemen met taal/datumformat
    Voorbeeld:waarom is mijn CASE-expressie niet-deterministisch?
  • float vertrouwt op interne opslag
  • het breidt zich uit om de eerste dag van de maand, morgen, enz. uit te werken door de basis van "0" te wijzigen

Bewerken, okt 2011

Voor SQL Server 2008+ kunt u CAST naar date d.w.z. CAST(getdate() AS date) . Of gebruik gewoon date datatype dus geen time te verwijderen.

Bewerken, jan 2012

Een uitgewerkt voorbeeld van hoe flexibel dit is:Noodzaak om te berekenen op afgeronde tijd of datum in sql-server

Bewerken, mei 2012

Gebruik dit niet in WHERE-clausules en dergelijke zonder na te denken:het toevoegen van een functie of CAST aan een kolom maakt het indexgebruik ongeldig. Zie hier nummer 2 Veelvoorkomende fouten bij het programmeren van SQL

Dit heeft een voorbeeld van latere SQL Server-optimizerversies die CAST tot op heden correct beheren, maar in het algemeen het zal een slecht idee zijn ...

Bewerken, sep 2018, voor 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. JSON_QUERY() Functie in Oracle

  2. Converteer tekstvak naar geheel getal

  3. Lock-in van databaseleveranciers voor MySQL of MariaDB vermijden

  4. Controleer de status van de database-e-mailwachtrijen in SQL Server (T-SQL)