Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

L'approccio migliore per rimuovere la parte temporale di datetime in SQL Server

Rigorosamente, metodo a è il meno dispendioso in termini di risorse:

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

Dimostrato meno dispendioso in termini di CPU per la stessa durata totale di un milione di righe da parte di qualcuno con troppo tempo a disposizione:il modo più efficiente in SQL Server per ottenere una data da data e ora?

Ho visto un test simile anche altrove con risultati simili.

Preferisco il DATAADD/DATEDIFF perché:

  • varchar è soggetto a problemi di lingua/formato data
    Esempio:perché la mia espressione CASE non è deterministica?
  • float si basa sulla memoria interna
  • si estende per allenarsi il primo giorno del mese, domani, ecc. cambiando la base "0"

Modifica, ottobre 2011

Per SQL Server 2008+, puoi trasmettere in date cioè CAST(getdate() AS date) . Oppure usa semplicemente date tipo di dati quindi nessun time rimuovere.

Modifica, gennaio 2012

Un esempio funzionante di quanto sia flessibile:è necessario calcolare in base all'ora o alla data arrotondata nel server sql

Modifica, maggio 2012

Non usarlo nelle clausole WHERE e simili senza pensare:l'aggiunta di una funzione o CAST a una colonna invalida l'utilizzo dell'indice. Vedere il numero 2 qui Errori comuni di programmazione SQL

Ora, questo ha un esempio di versioni successive dell'ottimizzatore di SQL Server che gestiscono CAST fino ad oggi correttamente, ma generalmente sarà una pessima idea...

Modifica, settembre 2018, per 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)