Har en tabell som heter OuterRateCategory. Namnet på tabellen är en lång historia. OK... här kommer lite mer info. Så man struntar i vilken dag i månaden man bokar? Nej man struntar inte i vilken dag man bokar. Dagarna kommer också att spela roll eftersom det blir dagen som i vissa fall avgör när en säsong slutar och tar vid under samma månad. OK... jag släpper frågan lös på detta sätt istället och hoppas på tur. Hej, Blev lite nyfiken Martin... det är inte för gästerna som systemet ang. säsongerna skall vara tillgängligt. Det är för den administrativa personalen på hotellet. För gästens vidkommande spelar säsongerna inte så stor roll men däremot för prislistorna. För att rätt pris skall kunna debiteras gästen måste systemet veta under vilken eller vilka säsonger bokningen sker. Därpå skall systemet sedan räkna ut priset på bokningen som gästen sedan skall kunna acceptera eller inte acceptera. Peter, Inget är besvärligt här annat än mitt lilla problem. Martin, jag är bara tacksam för din hjälp och jag skall sätta mig in dina förslag här ovanför.Nytt SQL problem... Någon?
Tabellen innehåller en räknare (IDORC), fältet SeasonStartMonth som spar månader då säsonger startar och fältet SeasonEndMonth som spar månader då säsonger slutar.
Det finns tre säsonger att ta hänsyn till vid tex en bokning av motellrum.
Säsong 1(IDORC) SeasonStartMonth 12 och SeasonEndMonth 01
Säsong 2(IDORC) SeasonStartMonth 02 och SeasonEndMonth 04
Säsong 3(IDORC) SeasonStartMonth 05 och SeasonEndMonth 12
Jag vill kunna plocka fram säsong/säsonger beroende på de månader som bokas.
Tex om jag bokar ett rum månad 12 tom månad 12 så skall säsongerna 1,2 och 3 plockas fram. Bokar jag et rum månad 06 tom 07 skall endast säsong 3 plockas fram.
Jag har försökt fram och tillbaka med olika SQL satser men det vill sig inte fullt ut.
Kan någon av er?Sv: Nytt SQL problem... Någon?
Två följdfrågor innan jag tittar på SQL:en:
1. Borde inte Säsong 1 gå från Månad 1 till Månad 1? Till vilken säsong hör annars Månad 12, till Säsong 1 eller Säsong 3?
2. En bokning från Månad 12 till Månad 12, borde inte den bara höra till EN säsong? Jag menar, det är väl vanligare att man bokar kortare tid än ett år, och en bokning av ett helt år borde ju heta från Månad 1 till Månad 12. Om man inte menar 13 månader förstås.
/GöranSv: Nytt SQL problem... Någon?
Säsong 1 sträcker sig mellan 20:e december och 31:e januari.
Säsong 2 mellan 1:a februari och 30:e april
Säsong 3 mellan 1:a maj och 19:e december
Svar till fråga 1. Månad 12 hör alltså till både säsong 1 och 3
Svar till fråga 2. Eftersom säsongerna spänner över månaderna kan det, som i detta fallet hända att en månad också kan tillhöra två säsonger.
Hoppas infon gjorde det lite klarare.
Så här tex skulle jag vilja skriva för att få ut det jag vill ha men icke.
Och om det nu mot förmodan skulle funka med just dessa månaderna så funkar det inte alltid då jag byter månader i villkoren.
SELECT OuterRateCategory.IDORC FROM OuterRateCategory
WHERE OuterRateCategory.SeasonStartMonth >= '12'
AND OuterRateCategory.SeasonEndMonth <= '01'Sv: Nytt SQL problem... Någon?
En bokning från 1/12 till 2/12 blir både Säsong 1 och 3, trots att ettan egentligen inte har börjat än?
En annan fundering; ett faktum som "förfular" eventuella lösningar är att Säsong 1 har en startmånad som är större än dess slutmånad. Det går givetvis att lösa med en massa iffar, men kunde man inte ändra i databasen till något i stil med:
ID Säsong# StartMån SlutMån
-- ---------- ---------- ---------
1 1 1 1
2 2 2 4
3 3 5 12
4 1 12 12
...jag vet att svar av typen "kan man inte först designa om ditt system" inte är så kul, men jag måste bara fråga först. Ibland lägger man onödigt mycket kraft på att gå runt en dum lösning, istället för att ta ett steg tillbaka och sedan swischa vidare...Sv: Nytt SQL problem... Någon?
Jag valde att bara ta upp månaderna här i forumet eftersom jag tänkte att problemet blir enklare att lösa och att jag bygger på med dagarna efteråt.
Omdesign av tabellstrukturen kanske är att föredra för det verkar smått omöjligt att komma runt problemet som det är nu.
Tabellen ser ut på följande sätt:
IDORC SeasonStartMonth SeasonEndMonth SeasonStartDay SeasonEndDay
------- -------------------- ------------------- ----------------- ----------------
1 12 01 20 31
2 02 04 01 30
3 05 12 01 19
Om det är enklare att jobba med dagarna till respektive säsongstart och slut så ser det ut så här.Sv: Nytt SQL problem... Någon?
Du skall skapa en databas eller tabell/tabeller i en databas åt "Hotellet Sov mjukt".
Hotellet har tre olika säsonger som spänner över en tolvmånadsperiod. Säsong 1 löper mellan den 20:e december och den 31:e januari. Säsong 2 löper mellan den 1:a februari och den 30:e april och slutligen säsong 3 som löper mellan den 1:a maj och den 19:e december.
Vad behöver plockas fram ur denna/dessa tabell/tabeller?
1. Antag att en gäst bokar sig för ett rum den 1:e januari tom den 15.e januari.
Gästen skall bokas under säsong 1.
2. Antag att en gäst bokar sig för ett rum den 5:e januari tom den 5:e februari.
Gästen skall bokas under säsongerna 1 och 2.
3. Antag att en gäst bokar sig för ett rum den 1:e januari tom den 31:e december.
Gästen skall bokas under säsongerna 1, 2 och 3.
4. Antag att en gäst bokar sig för ett rum den 15:e december tom den 15:e januari.
Gästen skall bokas under säsongerna 3 och 1.
Hur skulle du modulera upp en databas/tabell/tabeller och sedan köra SQL för att få ut rätt säsonger enligt ovan?
Kuriosa... varför är säsongerna så viktiga? Olika prislistor tillämpas vid de olika säsongerna och därför måste systemet hantera säsongerna på riktigt sätt.
Tack på förhand!Sv: Nytt SQL problem... Någon?
Om du inte har något annat i tabellen tycker jag den tabellen ser helt korrekt ut,
antar att du också har en tblPrislista med priserna knutna till säsongen samt
tblBokning mfl.
Borde inte vara något problem att skapa en bra query, fast jag rekommenderar en
stored procuder där du skickar in start- och slut-datum och även annan nödvändig
information för att kunna utföra bokningen.
<code>
create procudure utforBokning
(stardatum smalldatetime,
slutdatum smalldatetime,
......)
AS
Declare isasong integer
SELECT sasong FROM tblSasong
WHERE month(tblstartdatum) >= sasongStartManad
AND day(tblstartdatum) >= sasangStartDatum
AND month(tblslutdatum) <= sasonSlutManad
AND day(tblslutDatum) <= sasongSlutDag
AND sasong != 1;
</code>
Ber om ursäkt att jag inte använde din notation... men skrev på frihand. Länge sedan
jag skrev SQL så betrakta koden ovan som pseudokod...
Problemet med SQL-satsen är egentligen att alla kommer att matcha säsong 1 _och_
2 eller 3. Därför bör du undersöka om sasongen finns i 2 eller 3, gör den inte det är
den 1.
/EmmaSv: Nytt SQL problem... Någon?
"Kuriosa... varför är säsongerna så viktiga? Olika prislistor tillämpas vid de olika säsongerna och därför måste systemet hantera säsongerna på riktigt sätt."
Om jag skall boka ett rum varför skulle jag då vilja veta vilka säsonger det handlar om? Det jag vill veta är:
1. Att det finns ett rum ledigt under hela bokningsperioden (helst samma rum)
2. Priset per natt (vilket väl inte bara varierar med säsongen utan även med veckodag, rabattavtal mm)
Hur skall man använda informationen "bokningen sträcker sig över säsong 1 & 2".Sv: Nytt SQL problem... Någon?
Emma... Jag får prova ditt exempel.
Det är helt rikrigt. Jag har en prislistetabell och en bokningstabellSv: Nytt SQL problem... Någon?
Inte för att verka besvärlig men jag förstår inte hur du kan räkna ut priset genam att veta vilka säsonger bokningen sträcker sig över. Ser inte algoritmen för att räkna ut priset ut så här ungefär:
For datum = startDatum To slutDatum
rumNr = HittaLedigtRum(datum)
pris = pris + prisFörRum(rumNr, datum)
Next
dvs funktioen prisFörRum behöver endast veta vilken säsong ett visst datum ingår i och inte vilka säsonger hela bokningen ingår i.
Husomhelst. Jag skulle nog rekommendera dig att använda kompletta datum (år-mån-dag) istället. Enda nackdelen är att du måste lägga in säsongerna för varje år men det kan du ju göra för 100 år framåt från början om du vill. Fördelarna är flera:
- Det är enkelt att lägga till en extra säsong ett år (t.ex en jubileumsvecka eller höjt pris när det är kongress i stan)
- Det blir enklare frågor att ta reda på säsonger
Tabellen skulle kunna se ut så här:
SeasonStart SeasonEnd Season
----------------------------
02-12-20 03-01-31 1
03-02-01 03-04-30 2
03-05-01 03-12-19 3
03-12-20 04-01-31 1
För att då se vilken säsong ett visst "datum" är
SELECT season FROM seasonTbl WHERE datum BETWEEN seasonStart AND seasonEnd
Eller för att se alla säsonger en bokning sträcker sig över
SELECT season FROM seasonTbl WHERE (seasonStart BETWEEN startDatum AND slutDatum) OR (seasonEnd BETWEEN startDatum AND slutDatum) OR (startDatum BETWEEN seasonStart AND seasonEnd)
(Lägg märke till att denna fråga även fungerar över mer än 2 säsonger 03-01-31 - 03-05-01)
Dock verkar det vara en extra omväg att använda säsonger. Jag antar att du använder säsongsnumret tillsammans med året för att hitta prislistan. Varför då inte lägga in prislistan direkt i tabellen så sparar du ett steg.
SeasonStart SeasonEnd Season priceList
--------------------------------------
02-12-20 03-01-31 1 03-1
03-02-01 03-04-30 2 03-2
03-05-01 03-12-19 3 03-3
03-12-20 04-01-31 1 04-1Sv: Nytt SQL problem... Någon?