Vinnaren i pepparkakshustävlingen!
2013-05-06, 16:45
  #1
Medlem
Om man ska påminna en chef om att en anställd ska ha löneförhöjning var sjätte månad fr o m anställningsdatum, hur kan man lösa det då?

Man vill typ ta reda på varje dag om det ska skickas en påminnelse eller ej till chefen. Hur räknar man ut ifall det är dags eller ej utifrån anställningsdatum och dagens datum?
Citera
2013-05-06, 17:03
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av PN
Om man ska påminna en chef om att en anställd ska ha löneförhöjning var sjätte månad fr o m anställningsdatum, hur kan man lösa det då?

Man vill typ ta reda på varje dag om det ska skickas en påminnelse eller ej till chefen. Hur räknar man ut ifall det är dags eller ej utifrån anställningsdatum och dagens datum?
DATEDIFF borde komma till undsättning här:

Kod:
DECLARE @dateparts INTEGER
SELECT 
@dateparts DATEDIFF(monthstartdateGETDATE()) FROM sometable
IF @dateparts 0
BEGIN
--do stuff every 6 months.....
END 
Nånting sånt kanske?
Citera
2013-05-07, 15:12
  #3
Medlem
fnirps avatar
Citat:
Ursprungligen postat av PN
Om man ska påminna en chef om att en anställd ska ha löneförhöjning var sjätte månad fr o m anställningsdatum, hur kan man lösa det då?

Man vill typ ta reda på varje dag om det ska skickas en påminnelse eller ej till chefen. Hur räknar man ut ifall det är dags eller ej utifrån anställningsdatum och dagens datum?

Föregående lösning är ett bra steg på vägen, men kommer skicka påminnelse till chefen varje dag i en hel månad och så får man nog ingen löneförhöjning :-)

Jag moddade koden lite och fick till följande:

Först skapar jag en tabell med datum för att ha att testa mot

Kod:
create table #check_date (run_date smalldatetime)

declare @i int
set @i = 0
while (@i < 1000)
begin
	insert #check_date (run_date)
		select dateadd(day, @i, '2011-01-01')
	set @i = @i + 1
end

Sedan kommer själva körningen och här ser du vilka datum som en påminnelse kommer skickas.
Den skickar inte något på anställningsdagen, utan skickar första påminnelsen sex månader efter anställning:

Kod:
declare @employed smalldatetime
set @employed = '2011-02-01'

select run_date
	, case when datediff(month, @employed, run_date) % 6 = 0 and day(run_date) = day(@employed) and datediff(month, @employed, run_date) > 0 then 1 else 0 end as Skicka_påminnelse
from #check_date
where case when datediff(month, @employed, run_date) % 6 = 0 and day(run_date) = day(@employed) and datediff(month, @employed, run_date) > 0 then 1 else 0 end = 1
order by run_date

Upprensad kod utan lull-lull som du kan bygga vidare på
Kod:
declare @employed smalldatetime, @run_date smalldatetime
set @employed = '2011-02-01'
set @run_date = '2013-02-01'

select case when datediff(month, @employed, @run_date) % 6 = 0 and day(@run_date) = day(@employed) and datediff(month, @employed, @run_date) > 0 then 1 else 0 end as Skicka_påminnelse
Citera
2013-05-07, 22:00
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av fnirp
Föregående lösning är ett bra steg på vägen, men kommer skicka påminnelse till chefen varje dag i en hel månad och så får man nog ingen löneförhöjning :-)

Jag moddade koden lite och fick till följande:

Först skapar jag en tabell med datum för att ha att testa mot

Kod:
create table #check_date (run_date smalldatetime)

declare @i int
set @i = 0
while (@i < 1000)
begin
	insert #check_date (run_date)
		select dateadd(day, @i, '2011-01-01')
	set @i = @i + 1
end

Sedan kommer själva körningen och här ser du vilka datum som en påminnelse kommer skickas.
Den skickar inte något på anställningsdagen, utan skickar första påminnelsen sex månader efter anställning:

Kod:
declare @employed smalldatetime
set @employed = '2011-02-01'

select run_date
	, case when datediff(month, @employed, run_date) % 6 = 0 and day(run_date) = day(@employed) and datediff(month, @employed, run_date) > 0 then 1 else 0 end as Skicka_påminnelse
from #check_date
where case when datediff(month, @employed, run_date) % 6 = 0 and day(run_date) = day(@employed) and datediff(month, @employed, run_date) > 0 then 1 else 0 end = 1
order by run_date

Upprensad kod utan lull-lull som du kan bygga vidare på
Kod:
declare @employed smalldatetime, @run_date smalldatetime
set @employed = '2011-02-01'
set @run_date = '2013-02-01'

select case when datediff(month, @employed, @run_date) % 6 = 0 and day(@run_date) = day(@employed) and datediff(month, @employed, @run_date) > 0 then 1 else 0 end as Skicka_påminnelse
Fan, det har du ju rätt i

Då får man ta till lite ytterligare kod för att ta reda på om det är den första i månaden i sådana fall, borde gå att göra med att ta ut dagen och kolla om det är 1, borde inte det räcka egentligen?
Citera
2013-05-08, 09:11
  #5
Medlem
fnirps avatar
Citat:
Ursprungligen postat av Proton
Fan, det har du ju rätt i

Då får man ta till lite ytterligare kod för att ta reda på om det är den första i månaden i sådana fall, borde gå att göra med att ta ut dagen och kolla om det är 1, borde inte det räcka egentligen?

Det var precis som du skrev som jag gjorde, jag kollar om dagen i månaden är lika med anställningsdagen, plus att jag kollar att månaden är jämt delbar med 6 och att personen varit anställd mer än noll månader (för att inte få upp en påminnelse redan första dagen på jobbet).

Men men, vi saknade ju en tillräckligt detaljerad kravspec på hur det skulle funka, så vi får ju anta. Personligen tycker jag det verkar dumt att köra en koll varje dag. En gång i månaden (en gång i veckan?) borde ju räcka och då får chefen ett enda mail istället för trettio (om det är många anställda kan det ju bli ett mail om dagen).
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback