ugrás a tartalomhoz

tömbök

Danonino · 2010. Okt. 22. (P), 11.58
sziasztok.
valahogy nem tudok megoldani egy problémámat:(
van egy foglaltsági űrlapom és ha a felhasználó megad egy időpontot, hogy mettől meddig akarna jönni, és ha véletlen olyan időpontot akart megadni ami már foglalt írja ki, hogy az időpont foglat.
pl: én úgy oldottam meg hogy az időpont egy szám (20110625-20110709 között foglal).
DE ha a felhasználó azt adja meg hogy 20110624-20110710 között szeretne jönni, már nem írja ki nekem, hogy foglalt az időpont.
ezt hogy tudnám megoldani?
remélem sikerült rendesen magyarázni, és köszönöm előre is a válaszokat.
 
1

szám

Poetro · 2010. Okt. 22. (P), 12.18
Bár én itt nem látok számot, legfeljebb, ha elvégezzük a kivonásokat, de mindegy. Amit érdemes lenne csinálni, hogy veszed a kezdő dátumot, amit a felhasználó szeretne, megnézed az a nap foglalt-e. Majd egyesével léptetsz az záró dátumig, miközben mindig megnézed, az a nap foglalt-e. Ha igen, akkor befejezed a lépkedést, és kiírod, hogy foglalt.
3

jól hangzik

Danonino · 2010. Okt. 22. (P), 12.42
jól hangzik a dolog.
ezt kifejtenéd kicsit bővebben, hogy hogy kéne megvalósítani, egy példával..
köszi
5

Példa

Poetro · 2010. Okt. 22. (P), 13.02
FoglaltKezdő = 20110625;
FoglaltVég = 20110709;
FelhasznaloKezdő = 20110624;
FelhasznaloVég = 20110710;
For (Aktuális = FelhasználóKezdő; Aktualis < FelhasználóVég; Aktuális += 1 nap ) {
  if (Aktuális in (FoglaltKezdő, FoglaltVég)) {
    throw FoglaltError;
  }
}
7

mit jelent?

Danonino · 2010. Okt. 22. (P), 13.24
ez a rész mit jelent?
if (Aktuális in (FoglaltKezdő, FoglaltVég)) {
    throw FoglaltError;
8

Kreatív

Poetro · 2010. Okt. 22. (P), 13.29
Azt hogy ma még nem tettél egyetlen kreatív fűzszálat se keresztbe.
10

keves válasz

Danonino · 2010. Okt. 22. (P), 13.50
köszönöm a kedves választ
2

Mivel az adatokat valahol

kuka · 2010. Okt. 22. (P), 12.34
Mivel az adatokat valahol úgyis tárolni kell, én ezt rábíznám az adatbázis szerverre. Feltéve, hogy te is PostgreSQL-t használsz:
select * from foglalas;
.id |    tol     |     ig    
----+------------+------------
  1 | 2011-06-25 | 2011-07-09
(1 row)
select count(*) from foglalas where ( tol, ig ) overlaps ( date '2011-06-24', date '2011-07-10' );
.count
-------
     1
(1 row)
Aztán ha count nem nulla, akkor sikítasz.
4

Igen

iollari · 2010. Okt. 22. (P), 12.57
Ez még frappánsabb, ha Postgre-t használ. Amúgy ez más szervertípuson (MySQL, MSSQL) nem megy?
9

Oracle-ben láttam még ilyent

kuka · 2010. Okt. 22. (P), 13.29
Oracle-ben láttam még ilyent (azonos szintaxissal), de ott nem használtam. MySQL-ben tudtommal nincs.
14

Elméletileg mysqlben is

neogee · 2010. Okt. 26. (K), 09.24
Elméletileg mysqlben is megoldható hasonlóan a BETWEEN segítségével. :) Csak hosszabb lesz a lekérdező karakterlánc :)
SELECT count(foglalas.id)
FROM `foglalas`
WHERE
  ( foglalas.tol BETWEEN $tol AND $ig ) OR
  ( foglalas.ig BETWEEN $tol AND $ig )
Valami ilyesmire tippelek, aztán lehet hogy van ennél egyszerűbb is :)
15

Ez nem éppen

kuka · 2010. Okt. 26. (K), 10.09
Ez nem éppen tökéletes.
foglalas.tol=5
foglalas.ig=25
$tol=10
$ig=20
( 5 BETWEEN 10 AND 20 ) OR ( 25 BETWEEN 10 AND 20 )
Ez így hamis, holott az intervallumok fedik egymást.
16

Teljesen igazad van. Ennek

neogee · 2010. Okt. 26. (K), 12.54
Teljesen igazad van.

Ennek már jónak kell lennie:
 SELECT count(teszt.id)  
 FROM `teszt`  
 WHERE  
   ( $tol BETWEEN teszt.tol AND teszt.ig ) OR  
   ( $ig BETWEEN teszt.tol AND teszt.ig ) OR
   ( teszt.tol BETWEEN $tol AND $ig ) OR  
   ( teszt.ig BETWEEN $tol AND $ig )
6

Szerintem egyszerű

iollari · 2010. Okt. 22. (P), 13.07
Néhány feltételt kell vizsgálni

adott négy változó:
FoglaltTol (már foglalt időszak kezdete)
FoglaltIg (már foglalt időszak vége)
UjFoglalasTol (új foglalás kezdete)
UjFoglalasIg (új foglalás vége)

Feltételek, amelyek ha teljesülnek, akkor már foglalt az új időszak:

1. Ha (UjFoglalasTol <= FoglaltTol) ÉS (UjFoglalasIg >= FoglaltTol)

2. Ha (UjFoglalasTol >= FoglaltTol) ÉS (UjFoglalasTol <= FoglaltIg)

A példádban szereplő eset az 1 miatt fogja tiltani a foglalást, de akkor is tiltja, ha az új foglalás vége a már foglalt intervallumban van. Ha az új foglalás kezdete a már foglalt intervallumba esik, akkor a 2 feltétel miatt fogja tiltani.
Minden más esetben mehet a foglalás, persze nem árt vizsgálni, hogy a foglalás kezdete kisebb vagy egyenlő legyen a végével.

Tehát:

HA ((UjFoglalasTol <= FoglaltTol) ÉS (UjFoglalasIg >= FoglaltTol))
VAGY ((UjFoglalasTol >= FoglaltTol) ÉS (UjFoglalasTol <= FoglaltIg))
AKKOR tiltani kell az új foglalást.
11

mukodik

Danonino · 2010. Okt. 22. (P), 13.57
hát ez mukodik, zseni vagy ;)
köszönöm szépen!
12

Nem vagyok zseni

iollari · 2010. Okt. 22. (P), 14.16
Szívesen!

És bár nem akarlak bántani, mert különben nem is írtam volna le a megoldást, de azért ismerd el, ha életedben programoztál már 3 napnál többet (vagy 3 óránál?) akkor erre egyedül is rájöttél volna igen hamar...

Üdv,
iollari
13

gondolkoztam

Danonino · 2010. Okt. 22. (P), 14.42
hát nem vagyok egy profi, még csak most tanuljuk a suliba a php-t én meg kicsit előresietek mindig.
én is törtem a fejem mielőtt ide írtam volna, de valahogy ez nem ugrott be nekem. mindenhogyan gyűrtem csavartam de nem sikerült úgy ahogy kellet volna. mindegy, meg lett a megoldás és nagyon szépen köszönöm:)