Porovnání dvou dat (pouze měsíc a rok)   zodpovězená otázka

SQL, Databáze

Zdravím, narazil jsem na potřebu porovnat v T-SQL dvě data, ale bez ohledu na rok. Tzn. vezmu sledované datum a porovnám z něj měsíc a rok s aktuálním datem. A potřebuju vědět pouze to, zda je aktuální datum větší nebo rovno, nebo zda je menší.

vymyslel jsem toto:

DECLARE @sledovaneDatum DATETIME
DECLARE @vysledek varchar(255)

SET @sledovaneDatum='2009-07-25'

IF datepart(month,getdate())>datepart(month,@sledovaneDatum) SET @vysledek='aktuální datum je větší'  --aktuální měsíc je větší než sledovaný
IF datepart(month,getdate())=datepart(month,@sledovaneDatum) --aktuální i sledovaný měsíc jsou si rovny
	BEGIN
		IF datepart(day,getdate())>=datepart(day,@sledovaneDatum) SET @vysledek='aktuální datum je větší nebo rovno'
		ELSE
		 SET @vysledek='aktuální datum je menší'
	END
IF datepart(month,getdate())<datepart(month,@sledovaneDatum) SET @vysledek='aktuální datum je menší'  --aktuální měsíc je menší než sledovaný




SELECT @vysledek

Snažil jsem se pracovat pouze s formátem dateTime, tzn. nepřevádět na stringy, aby při spojování nevznikl problém při přechodu na server s jinou jazykovou kulturou. Ale příjde mi, že na tak jednoduchou věc je to něják moc kódu. Chtěl bych jen vědět zda v tom nevidíte nějákou prasečinku a pokud ano, jak jinak by jste to řešili.

Díky

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

Tak a ještě jsem vymyslel druhou část, kde už vím že to prasečinka je, ale nevím jak to řešit jinak. Jde o to že procedura výše mi vrátí, zda je datum vetší a rovno nebo menší. A na základě toho potřebuji vzít výše uvedené datum a:

1) Pokud je aktuální datum větší nebo rovno, vezmu zadaný den a měsíc a dám k němu letošní rok.

2) Pokud je aktuální datum menší, vezmu výše uvedené datum a dám k němu loňský rok.

Přidávám ještě jednou výše uvedenou proceduru která je trochu upravená a do které je už přidaná zmíněná funkce.

DECLARE @sledovaneDatum DATETIME
DECLARE @vysledek varchar(10)
DECLARE @letosniVyroci bit --indikuje zda už letos bylo výročí.
						   --TRUE=letos už bylo výročí, pro přepočet věku vezmu letošní výročí
						   --FALSE=letos výročí ještě nebylo, pro přepočet věku vezmu loňské výročí
								
SET @sledovaneDatum='2007-08-25'

IF datepart(month,getdate())>datepart(month,@sledovaneDatum) SET @letosniVyroci=1  --aktuální měsíc je větší než sledovaný

IF datepart(month,getdate())=datepart(month,@sledovaneDatum) --aktuální i sledovaný měsíc jsou si rovny
	BEGIN
		IF datepart(day,getdate())>=datepart(day,@sledovaneDatum) SET @letosniVyroci=1
		ELSE
		 SET @letosniVyroci=0
	END

IF datepart(month,getdate())<datepart(month,@sledovaneDatum) SET @letosniVyroci=0  --aktuální měsíc je menší než sledovaný




IF @letosniVyroci=0 SET @vysledek=CONVERT(varchar(4),datepart(year,getdate())-1)+'-'+CONVERT(varchar(2),datepart(month,@sledovaneDatum))+'-'+CONVERT(varchar(2),datepart(day,@sledovaneDatum))
IF @letosniVyroci=1 SET @vysledek=CONVERT(varchar(4),datepart(year,getdate()))+'-'+CONVERT(varchar(2),datepart(month,@sledovaneDatum))+'-'+CONVERT(varchar(2),datepart(day,@sledovaneDatum))


select @vysledek

Zde bych potřeboval poradit jak se vyvarovat tomu ošklivému skládání stringu. Na serveru mi to teď šlape, ale nevznikne problém když bych proceduru použil na serveru s jinou jazykovou kulturou?

A pokud by vzniknul problém, vyřeší to SET dateformat ymd ? Jak vlastně funguje? Pro přepočet by to mělo být OK, ale co když hodnotu uložím do tabulky?

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

Možná existuje ještě jednodušší řešení, ale určitě lze porovnávat měsíc a den.


IF (MONTH(GETDATE())= MONTH(@sledovaneDatum) AND DAY(GETDATE())= DAY(@sledovaneDatum))


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

Ano, ale takto zjistíte pouze zda dnesek se shoduje se sledovaným dnem, ale už nezjistíte zda ten den letos už byl.

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

Aha, omylem jsem to nevložil celé :)

IF (MONTH(GETDATE())= MONTH(@sledovaneDatum) AND DAY(GETDATE())= DAY(@sledovaneDatum))
BEGIN
--Je stejne
END
ELSE
BEGIN
   IF (MONTH(GETDATE()) < MONTH(@sledovaneDatum) OR ((MONTH(GETDATE()) = MONTH(@sledovaneDatum) AND DAY(GETDATE())< DAY(@sledovaneDatum)))
   BEGIN
   --Letos to jeste nebylo
   END
   ELSE
   BEGIN
   --Letos to uz bylo
   END
END
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Dá se použít takový matfyzácký trik - rok vynásobíte dvanácti a přičtete k tomu měsíc - 1. Vlastně si tím spočítáte počet měsíců od roku 1 a ty pak můžete porovnávat.

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

Díky, vyzkouším:)

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