sql >> Databáze >  >> RDS >> Sqlserver

Nejlepší přístup k odstranění časové části datatime na serveru SQL Server

Přesněji řečeno, metoda a je nejméně náročná na zdroje:

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

Prokazatelně méně náročné na CPU za stejnou celkovou dobu trvání milion řádků někým, kdo má v rukou příliš mnoho času:Nejúčinnější způsob na SQL Serveru, jak získat datum z data a času?

Viděl jsem podobný test jinde s podobnými výsledky.

Dávám přednost DATEADD/DATEDIFF, protože:

  • varchar podléhá problémům s jazykem/formátem data
    Příklad:Proč je můj výraz CASE nedeterministický?
  • Float se spoléhá na interní úložiště
  • Rozšiřuje se na cvičení první den v měsíci, zítra atd. změnou základu „0“

Upravit, říjen 2011

Pro SQL Server 2008+ můžete CAST do date tj. CAST(getdate() AS date) . Nebo stačí použít date datový typ, takže žádný time odstranit.

Upravit, leden 2012

Zpracovaný příklad toho, jak flexibilní to je:Potřeba počítat podle zaokrouhleného času nebo data na serveru SQL

Upravit, květen 2012

Toto nepoužívejte v klauzulích WHERE a podobně bez přemýšlení:přidání funkce nebo CAST do sloupce znehodnotí použití indexu. Viz číslo 2 zde Běžné chyby programování SQL

Nyní zde máme příklad pozdějších verzí optimalizátoru SQL Server spravujících CAST k dnešnímu dni správně, ale obecně bude to špatný nápad ...

Upravit, září 2018, pro datum a čas2

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. Operátor neexistuje:json =json

  2. Jak přepnout databáze v psql?

  3. Nejjednodušší způsob, jak přidat více mezer do řetězce v MySQL – SPACE()

  4. LOAD DATA INFILE snadno převést YYYYMMDD na YYYY-MM-DD?