Jak v SQL Server 2005 získám aktuální datum bez časové části? Používal jsem GETDATE()
, ale chtěl bych, aby měl čas 00: 00: 00.0
Odpověď
Nejrychlejší , pokud musíte iterovat přes sadu záznamů a nemáte datum na serveru SQL Server 2008
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
Dvě různé a vynikající odpovědi na StackOverflow to potvrzují: Jeden , Dva
Konverze Varchar jsou jedním z nejhorších způsobů, jak to udělat. Samozřejmě, pro jednu hodnotu to nemusí vadit, ale je dobrým zvykem se do toho dostat.
Tento způsob je také deterministický , řekněte, pokud chcete indexovat vypočítaný sloupec. Dokonce i lidé, kteří píší knihy o serveru SQL Server, jsou chyceni s převody dat a času
Tuto techniku lze také rozšířit.
- včera:
DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)
- začátek měsíce:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
- konec posledního měsíc:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)
- začátek příštího měsíce:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)
Upravit :
Jak jsem již zmínil o determinismu, metody varchar nejsou bezpečné, pokud nepoužíváte styl 112.
Další odpovědi zde poukazují na to, že toto nikdy nepoužijete na sloupec. správně, ale možná budete chtít vybrat 100 000 řádků nebo přidat vypočítaný sloupec nebo GROUP BY dateonly. Pak musíte použít tuto metodu.
Druhá odpověď také zmiňuje styl 110. Toto není jazyk ani SET DATEFORMAT bezpečný a selhává s „britským“ nastavením jazyka. Viz konečný průvodce datovými typy datetime od Tibora Karasziho.
Komentáře
- Poskytnuto lin k je mrtvý.
Odpověď
Musíte jej převést na varchar se specifikací formátu (110 v tomto case) a poté převést (nebo odeslat) zpět na datetime.
select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)