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

Jak mohu zkrátit datum a čas na serveru SQL Server?

Toto stále často shromažďuje další hlasy, a to i o několik let později, a proto jej musím aktualizovat pro moderní verze serveru SQL. Pro SQL Server 2008 a novější je to jednoduché:

cast(getDate() As Date)

Všimněte si, že poslední tři odstavce v dolní části stále platí a často musíte udělat krok zpět a najít způsob, jak se vyhnout obsazení.

Ale existují i ​​jiné způsoby, jak toho dosáhnout. Zde jsou nejběžnější.

Správný způsob (nový od SQL Server 2008):

cast(getdate() As Date)

Správný způsob (starý):

dateadd(dd, datediff(dd,0, getDate()), 0)

To je nyní starší, ale stále stojí za to vědět, protože se také snadno přizpůsobí jiným časovým bodům, jako je první okamžik měsíce, minuta, hodina nebo rok.

Tento správný způsob využívá zdokumentované funkce, které jsou součástí standardu ansi a zaručeně fungují, ale může být poněkud pomalejší. Funguje to tak, že zjistí, kolik dní je ode dne 0 do aktuálního dne, a přidá tolik dní zpět ke dni 0. Bude to fungovat bez ohledu na to, jak je uloženo datum a čas a bez ohledu na to, jaké je vaše národní prostředí.

Rychlý způsob:

cast(floor(cast(getdate() as float)) as datetime)

To funguje, protože sloupce datetime jsou uloženy jako 8bajtové binární hodnoty. Sesílejte je tak, aby se vznášely, podložte je, abyste odstranili zlomek, a časová část hodnot bude pryč, když je přenesete zpět na datum a čas. Všechno se to jen trochu posouvá bez složité logiky a je to velmi rychle.

Uvědomte si, že to závisí na detailu implementace, který může společnost Microsoft kdykoli změnit, a to i v rámci automatické aktualizace služby. Také není příliš přenosný. V praxi je velmi nepravděpodobné, že se tato implementace v dohledné době změní, ale přesto je důležité si uvědomit nebezpečí, pokud se ji rozhodnete použít. A teď, když máme možnost obsazení jako rande, je to jen zřídka nutné.

Špatný způsob:

cast(convert(char(11), getdate(), 113) as datetime)

Špatný způsob funguje převodem na řetězec, zkrácením řetězce a převodem zpět na datum a čas. Je to špatné , ze dvou důvodů:1) nemusí to fungovat ve všech lokalitách a 2) jde o nejpomalejší možný způsob, jak to udělat... a ne jen trochu; je to jako o řád nebo dva pomalejší než ostatní možnosti.

Aktualizovat To v poslední době dostává nějaké hlasy, a tak k tomu chci dodat, že od té doby, co jsem to zveřejnil, jsem viděl docela solidní důkazy, že Sql Server optimalizuje rozdíl ve výkonu mezi „správným“ a „rychlým“ způsobem, což znamená, že byste nyní měli upřednostňovat první.

V obou případech chcete zapsat své dotazy, abyste se vyhnuli tomu, abyste to museli dělat na prvním místě . Je velmi vzácné, že byste tuto práci měli dělat na databázi.

Na většině míst je již databáze vaším úzkým hrdlem. Obecně je to server, který je nejdražší na přidání hardwaru pro zlepšení výkonu a nejtěžší je zajistit správná přidání (musíte například vyvážit disky s pamětí). Je také nejtěžší škálovat směrem ven, jak technicky, tak z obchodního hlediska; je technicky mnohem snazší přidat webový nebo aplikační server než databázový server, a i kdyby to bylo nepravdivé, neplatíte 20 000 $+ za serverovou licenci pro IIS nebo Apache.

Pointa, kterou se snažím udělat, je, že kdykoli je to možné, měli byste tuto práci provádět na úrovni aplikace. Jediné čas, kdy byste se měli někdy ocitnout při zkracování datatime na serveru SQL Server, je ten, kdy potřebujete seskupit podle dne, a i tehdy byste pravděpodobně měli mít další sloupec nastavený jako vypočítaný sloupec, udržovaný v čase vložení/aktualizace nebo udržovaný v aplikaci logika. Získejte tuto práci nabitou indexem a procesorem ze své databáze.



  1. Získejte všechny rodiče pro dítě

  2. SQLite Kde

  3. Použití SQL Server Profiler | Řešení problémů s výkonem serveru SQL -5

  4. SQL Server Vysoká dostupnost:Přidejte nový disk do existující instance clusteru s podporou převzetí služeb při selhání