datum bez času   zodpovězená otázka

SQL, Databáze

Ahoj, mám další dotaz ohledně data:) V SQL proceduře uložené na serveru potřebuju vložit do tabulky aktuální datum bez času, popřípadě podle aktuálního data bez času provést nějáké porovnání. Vyřešil jsem to tak že samotné datum získávám následujícím způsobem:

DECLARE @rok nvarchar(4)

DECLARE @mesic nvarchar(2)

DECLARE @den nvarchar(2)

DECLARE @datum datetime

SET @rok=datepart(yy,getdate())

SET @mesic=datepart(mm,getdate())

SET @den=datepart(dd,getdate())

SET @datum=@rok + '-' + @mesic + '-' + @den

Chtěl bych jenom vědět, zda je toto použití správné a hlavně jestli nepředstavuje zbytečnou zátěž navíc pro server pokud bude dotaz obsahující toto složení data spouštěn poměrně často (20x až 30x za minutu). Popřípadě pokud by to byla zbytečná zátěž navíc zda není nějáké lepší řešení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dělat z datumu string a zase ho pak parsovat na datum není příliš efektivní, já si na databázi spustím tento skript a pak tam mám dvě funkce, které umí vytáhnout z datetime čas, resp. datum:

-- vytáhne datum z hodnoty DATETIME
CREATE FUNCTION [ExtractDate] (
  @Date DATETIME
) RETURNS DATETIME AS BEGIN
  RETURN (SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @Date)))
END

-- vytáhne čas z hodnoty DATETIME
CREATE FUNCTION [ExtractTime] (
  @Date DATETIME
) RETURNS DATETIME AS BEGIN
  RETURN @Date - dbo.ExtractDate(@Date)
END

Použití je pak následující:

SELECT [dbo].[ExtractTime](GETDATE())

Pozor, to [dbo] tam být musí, bez něj to nefunguje.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Velmi děkuji. Absence samotného data nebo času byla věc která mě trápila už déle. Vždycky jsem musel vymýšlet nějáké kličky jak to obejít a přitom to je tak jednoduché:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mě hlavně štve, že když už si SQL server pokud vím jako jediná databáze dovolí nemít samostatný datový typ pro datum a samostatný pro čas, že na oddělení složky data a času nemá vestavěnou funkci a musí se to řešit takhle.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, je to trochu matoucí. Hlavě pro uživatele kteří s SQL serverem začínají. Například u mě to je tak, že donedávna jsem SQL server používal pouze jako místo, kde mám uložené tabulky ke kterým mají přístup ostatní uživatelé. Všechny dotazy a celá logika byla na aplikaci. Teď jsem se rozhodl že část aplikační logiky přesunu na server (pomocí T-SQL procedur - v mém případě prozatím jednoduché rozhodovací příkazy a obyčejné SQL dotazy, maximálně nějáký ten Job) a absence samotného data, času popřípadě ještě pár dalších droností jsou sice "prkotiny" které ale dokáží člověka celkem nepříjemně zdržet.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak to si dejte pozor také na datový typ DateTime (Date) v .NET Frameworku. Spousta začátečníků totiž netuší, že

Dim d1 As Date = Convert.ToDateTime("12:00:00")

bude ve skutečnosti odpovídat aktuálnímu datu v 12:00:00 hodin, nebo že

Dim d2 = Convert.ToDateTime("1.1.2008")

bude odpovídat datu 1.1.2008 v 0:00:00 hodin. Když si toto někdo neuvědomí, tak může strávit hodiny bádání nad tím, že mu nevychází porovnání datumů vytvořených podobným způsobem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback