[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Ren MYSQL fråga ang IF satser och datum beräkningar



Fråga: Vad ska du använda fjärde kolumnen till (den som inte har nåt
namn i exemplet, men vi kan kalla den 'Something_5' ;-)?
Om du bara ska använda den för att testa om det är rätt dag / månad
för att posten ska användas, så är väl det enklaste sättet att låta
databasen ta hand om det och bara returnera de poster du vill ha?
Om du tänker dig hur en if-elsesats kommer att se ut i
förlängningen, när du vill kolla efter den hundrade
sexmånadersperioden, så blir det en lite otymplig SQL-sats du får.

Om vi antar att du endast vill kolla om datumet ligger i en jämn
sexmånadersperiod bakåt, så borde du kunna lösa det med en WHERE
klausul, ungefär så här:

SELECT a AS vettigt_namn_1, b as vettigt_namn_2
FROM vettigt_tabellnamn
 WHERE MOD(PERIOD_DIFF(DATE_FORMAT(c, '%Y%m%d'),
 DATE_FORMAT(CURDATE(), '%Y%m%d')),6) = 0;

Detta baserat på antagandet att du vill räkna kalendermånader och inte
nånting bokföringsobskyrt som 30 dagarsperioder. ;-)
c är alltså namnet på den kolumn du vill matcha kalenderkollen mot.
Det blir lite rörigt eftersom man måste göra om datumen till strängar
för PERIOD_DIFF(). Sen bara kollar vi om vi får nån rest vid division
med 6. Får vi inte det så är det exakt 6, 12, 18, 24 o.s.v. månader
sen.
Vill du se om händelsen inträffar under den närmaste månaden? Byt ut =
0 mot <= 1. Så här:

SELECT a AS vettigt_namn_1, b as vettigt_namn_2
FROM vettigt_tabellnamn
 WHERE MOD(PERIOD_DIFF(DATE_FORMAT(c, '%Y%m%d'),
 DATE_FORMAT(CURDATE(), '%Y%m%d')),6) <= 1;

Just ja, du kanske bara vill ha med de händelser som inträffar under
eller efter dagens datum i varje månad också? Då lägger vi till en
WHERE sats med DAYOFMONTH(): DAYOFMONTH(c) >= DAYOFMONTH(CURDATE())
Så hela satsen ser ut så här:

SELECT a AS vettigt_namn_1, b as vettigt_namn_2
FROM vettigt_tabellnamn
 WHERE MOD(PERIOD_DIFF(DATE_FORMAT(c, '%Y%m%d'),
 DATE_FORMAT(CURDATE(), '%Y%m%d')),6) <= 1
 AND
 DAYOFMONTH(c) >= DAYOFMONTH(CURDATE());

Lycka till!
__
/ony
-------
Thursday, May 6, 2004, 10:40:17 AM, you wrote:

> Hej

> Försöker köra ett IF statement i MYSQL men det verkar inte fungera.

> Jag kör följande

>> USE databas
>> SELECT Item_A AS 'Something 1',
>> Item_B AS 'Something 2',
>> Item_C AS 'Something 3',
>> INTERVAL 6 MONTH + Item_B AS 'Something 4',
>> BEGIN IF CURDATE() >= INTERVAL 6 MONTH + Item_C THEN SELECT INTERVAL 12 MONTH + Item_C
>> [ELSEIF CURDATE() >= INTERVAL 12 MONTH + Item_C THEN SELECT INTERVAL 18 MONTH + Item_C]
>> ELSE INTERVAL 6 MONTH + Item_C)
>> END IF
>> FROM Table ;

> Vad jag vill göra är följande;

> Jag har en post "Item_C" som är ett datum. Sex månader efter Item_C 
> skall en händelse inträffa, sedan skall den händelsen fortsätta att 
> inträffa var 6:e månad intill dess att den post som Item_C är kopplad
> till får status "Upphörd".

> Med IF satsen har jag försöker jag åstadkomma följande;
> Om dagensdatum är större än eller lika med Item_C + 6 månader då skall i
> stället Item_C + 12 månader osv användas.

> Tanken är att om Item_C + 6 månader ger ett resultat som är "dåtid" dvs
> ligger i tiden före dagens datum då skall i stället närmast period efter
> dagens datum sökas och visas.

> Nästa steg är att bara visa resultatet om föregående stycke är lika med
> att resultat infaller under nästkommande månad.

> Det var lite invecklat det här...men om någon har lust eller känner sig
> hugad att bidra med synpunkter osv så tas det tacksamt emot.

> Thomas






Reply to: