[Solved] Select Range of dates between two fields

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 14 Ιουν 2008 15:17

Hello παίδες από τα Ελληνικά Στρατά :kaloe:

Long time no see :)


Λοιπόν έχω το εξής πρόβλημα.

Έχω έναν πίνακα με διάφορα πεδία μεταξύ των οποίων τα 2 έχουν ημερομηνίες.

Κρατάω ένα range ημερομηνιών (From - To) για κάθε row.

Πρόκειται για κρατήσεις δωματίων σε ξενοδοχείο.

Θέλω λοιπόν να φτιάξω ένα query που θα μου φέρνει τις εγγραφές των οποίων το range 'περνάει' μέσα από τον μήνα που θα του δίνω δυναμικά (ανάλογα με το ποιον μήνα βλέπει ο user από το front end).
Παράλληλα θέλω να μου φέρνει και όσα records έχουν From Date μέσα στον μήνα που βλέπει ο user ασχέτως τι ημερομηνία έχει το To Date.

Δηλαδή, αν έχω μία κράτηση από 05 Μαίου 2008 μέχρι 08 Ιουλίου 2008 και εγώ βλέπω τον μήνα Ιούνιο στο front end, θέλω να μου δείξει την εγγραφή η οποία περνάει 'πάνω' από όλο τον Ιούνιο.

Καθώς και αν έχουμε 14 Ιουνίου και υπάρχει κράτηση από 2 Ιουνίου 2008 μέχρι 6 Ιουνίου 2008 να μου την φέρει.

Ελπίζω να το εξήγησα κατανοητά :P

Δεν με περιορίζει ο τύπος των πεδίων (είτε DATE είτε timestamp (INT)).
Προσπάθησα και με τους 2 τρόπους αλλά δεν κατάφερα να κάνω κάτι που να είναι solid...

Any ideas?
Τελευταία επεξεργασία από το μέλος Cha0s την 08 Φεβ 2011 12:46, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
Alice_Cooper
Δημοσιεύσεις: 1947
Εγγραφή: 11 Μάιος 2007 00:33
Τοποθεσία: Ioannina
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από Alice_Cooper » 17 Ιουν 2008 01:51

xmmm gia dokimase kati tetio

Κώδικας: Επιλογή όλων

select * from kratish where date >= "'.$year.'-'.$month.'-1" AND date <= "'.$year.'-'.$month.'-31"';

kai pekse ligo .....

etc ki alios ftiaxno kati tetoio ... opote an to do ... otan ftaso sto shmio :p
tha sto grapso akrivos ;)

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 17 Ιουν 2008 01:59

Thanks για την απάντηση.

Τελικά την βρήκα την λύση με λίγο παραπάνω RTFM :hammer: :kaloe:

Κώδικας: Επιλογή όλων

$SELECT_RESERVATIONS = mysql_query&#40;"SELECT * FROM reservations WHERE Room_id = '$ROOMS&#91;id&#93;' AND &#40; '$CUR_MONTH' BETWEEN Date_from AND Date_to OR Date_from LIKE '$CUR_MONTH%' &#41; AND Active = '1' ORDER BY Room_id, Date_from ASC", $db&#41;;
Όπου η $CUR_MONTH περιέχει την ημερομηνία σε format 2008-06 χωρίς την μέρα.

Μέχρι στιγμής δείχνει να παίζει οκ.
Δεν ξέρω αν μου ξεφεύγει κάτι γιατί αυτό το BETWEEN με μπερδεύει λίγο :oops: :P

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 17 Ιουν 2008 02:04

Τώρα που το διάβασα καλύτερα το query σου, δεν λαμβάνει υπόψην κρατήσεις που ξεκινάνε και τελειώνουν έξω από το range (1 - 31) του τρέχωντος μήνα (που αυτό ήταν το βασικό σκάλωμα που είχα φάει δεδομένου ότι το start date & end date είναι σε 2 διαφορετικά πεδία).

Άβαταρ μέλους
Alice_Cooper
Δημοσιεύσεις: 1947
Εγγραφή: 11 Μάιος 2007 00:33
Τοποθεσία: Ioannina
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από Alice_Cooper » 17 Ιουν 2008 02:28

sostos .... den to ypologisa etc :doh: :think:

tha etroga ki ego psaksimo otan eftana ekei
oraia tora to exo ready :p

isos dokimaza kai kapos etc...

Κώδικας: Επιλογή όλων

select * from kratish where date >= "'.$year.'-'.$month.'-1" AND date2 <= "'.$year.'-'.$month.'-31"';

alla xoris db gia test den mporo na to sigourepso tora :p
mporei na epistrefei entelos oti nane :p

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από dva_dev » 17 Ιουν 2008 15:01

START_MONTH = 1η του μηνός
END_MONTH = τελευταία του μηνός
START_RES = εναρξη κράτησης
END_RES = λήξη κράτησης

Κώδικας: Επιλογή όλων

...
WHERE &#40;
    &#40;START_RES BETWEEN &#40;START_MONTH AND END_MONTH&#41; &#41; OR
    &#40;END_RES BETWEEN &#40;START_MONTH AND END_MONTH&#41; &#41; OR
    &#40;START_MONTH  BETWEEN &#40;START_RES AND END_RES&#41; &#41;
&#41;
[edit]
+ ότι άλλη συνθήκη θέλεις. Τώρα πρόσεξα ότι έχεις και ένα active....
[/edit]

[edit2]
ή πιο απλά

Κώδικας: Επιλογή όλων

WHERE NOT &#40; &#40;START_RES > END_MONTH&#41; OR &#40;END_RES < START_MONTH&#41; &#41;
[/edit2]

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 17 Ιουν 2008 17:15

dva_dev έγραψε:START_MONTH = 1η του μηνός
END_MONTH = τελευταία του μηνός
START_RES = εναρξη κράτησης
END_RES = λήξη κράτησης

Κώδικας: Επιλογή όλων

...
WHERE &#40;
    &#40;START_RES BETWEEN &#40;START_MONTH AND END_MONTH&#41; &#41; OR
    &#40;END_RES BETWEEN &#40;START_MONTH AND END_MONTH&#41; &#41; OR
    &#40;START_MONTH  BETWEEN &#40;START_RES AND END_RES&#41; &#41;
&#41;
[edit]
+ ότι άλλη συνθήκη θέλεις. Τώρα πρόσεξα ότι έχεις και ένα active....
[/edit]

[edit2]
ή πιο απλά

Κώδικας: Επιλογή όλων

WHERE NOT &#40; &#40;START_RES > END_MONTH&#41; OR &#40;END_RES < START_MONTH&#41; &#41;
[/edit2]
Έτσι όπως το βλέπω το query χωρίς να το έχω δοκιμάσει, νομίζω δεν κάνει αυτό που θέλω.
Δεν θέλω τις κρατήσεις ενός μήνα εντός αυτού.

Θέλω τις κρατήσεις είτε εντός είτε εκτός του μήνα που θα του δώσω.
Εκτός, εννοώ κρατήσεις που 'περνάνε' χρονικά 'πάνω' από τον μήνα.

Κοινώς το να χρησιμοποιήσω την πρώτη και τελευταία του μήνα μέσα στο query θα μου φέρει λιγότερα από τα επιθυμητά αποτελέσματα.

Πιθανόν να μην το εξηγώ σωστά i donno...

Όπως και να έχει με το query που πόσταρα πιο πάνω δείχνει να δουλεύει απροβλημάτιστα μέχρι στιγμής φέρνοντας έτσι πχ τις εξής κρατήσεις για τον μήνα Ιούνιο.

Κράτηση 1: Από 22-05-08 Έως 05-06-2008 (Ξεκινάει πριν τον τρέχων μήνα και τελειώνει μέσα σε αυτόν.
Κράτηση 2: Από 28-05-08 Έως 08-07-2008 (Ξεκινάει πρίν τον τρέχων μήνα και τελειώνει στον επόμενο)
Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα)
Κράτηση 4: Από 14-06-08 Έως 07-07-2008 (Ξεκινάει στον τρέχων μήνα και τελειώνει στον επόμενο)

Ουσιαστικά αυτές οι 4 περιπτώσεις είναι που θέλω να καλύψω.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από dva_dev » 17 Ιουν 2008 19:41

νομίζω δεν κάνει αυτό που θέλω
Και γιατί δεν δοκιμάζεις να σιγουρευτείς;
Ισως και να κάνει αυτό που θέλεις. ;)

Άβαταρ μέλους
Alice_Cooper
Δημοσιεύσεις: 1947
Εγγραφή: 11 Μάιος 2007 00:33
Τοποθεσία: Ioannina
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από Alice_Cooper » 18 Ιουν 2008 03:00

xmmm etc pou to vlepo tou dva mas kanei :p
opote den xriazete na to skefto otan ftaso malon :p

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 18 Ιουν 2008 04:48

dva_dev έγραψε:
νομίζω δεν κάνει αυτό που θέλω
Και γιατί δεν δοκιμάζεις να σιγουρευτείς;
Ισως και να κάνει αυτό που θέλεις. ;)
Είναι καλύτερο (πιο γρήγορο, πιο σωστό ,πιο whatever) από αυτό που έχω ποστάρει;

Αυτό που θέλω το κάνω ήδη όπως πόσταρα πιο πάνω.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από dva_dev » 18 Ιουν 2008 08:29

Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα)
Κράτηση 4: Από 14-06-08 Έως 07-07-2008 (Ξεκινάει στον τρέχων μήνα και τελειώνει στον επόμενο)
(START_RES BETWEEN (START_MONTH AND END_MONTH) ) OR
Πιάνει τις κρατήσεις 3 και 4 (δεν το ενδιαφέρει πότε τελειώνει, αρκεί να ξεκινάει μέσα στο μήνα).
Κράτηση 1: Από 22-05-08 Έως 05-06-2008 (Ξεκινάει πριν τον τρέχων μήνα και τελειώνει μέσα σε αυτόν.
Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα)
(END_RES BETWEEN (START_MONTH AND END_MONTH) ) OR
Πιάνει τις κρατήσεις 1 και 3 (δεν το ενδιαφέρει πότε ξεκινάει αρκεί να τελειώνει μέσα στο μήνα).
Κράτηση 2: Από 28-05-08 Έως 08-07-2008 (Ξεκινάει πρίν τον τρέχων μήνα και τελειώνει στον επόμενο)
(START_MONTH BETWEEN (START_RES AND END_RES) )
Πιάνει την κράτηση 2 που ξεκινάει πρίν την αρχή του μήνα και τελειώνει κάποια στιγμή μετά το τέλος του μήνα. Θα μπορούσαμε αντί για START_MONTH να ελέγχουμε το END_MONTH αν θέλουμε, το ίδιο είναι. Αλλά να ελέγχουμε και το START_MONTH και το END_MONTH είναι πλεονασμός.

Βέβαια θα μπορούσαμε να κάνουμε πιο απλή τη ζωή μας και για να γίνει πιο κατανοητό να φέρουμε και τις δύο περιπτώσεις κρατήσεων που μπορεί να υπάρχουν. Εχουμε συνολικά 6 περιπτώσεις
Κράτηση 1: Από 22-05-08 Έως 05-06-2008 (Ξεκινάει πριν τον τρέχων μήνα και τελειώνει μέσα σε αυτόν.
Κράτηση 2: Από 28-05-08 Έως 08-07-2008 (Ξεκινάει πρίν τον τρέχων μήνα και τελειώνει στον επόμενο)
Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα.
Κράτηση 4: Από 14-06-08 Έως 07-07-2008 (Ξεκινάει στον τρέχων μήνα και τελειώνει στον επόμενο)
Κράτηση 5: Από 01-01-04 Έως 10-01-2004 (Ξεκινάει κάποια στιγμή και τελειώνει πρίν τον τρέχων μήνα).
Κράτηση 6: Από 11-11-11 Έως 22-11-2011 (Ξεκινάει μετά τον τρέχων μήνα και τελειώνει κάποια στιγμή ακόμα αργότερα).

Εικόνα
Αντί να ψάχνουμε τις 1000 περιπτώσεις που θέλουμε να συμπεριλάβουμε μήπως είναι πιο απλό να του πούμε, φέρε τα πάντα εκτός από τις περιπτώσεις 5 και 6;
Κράτηση 5: Από 01-01-04 Έως 10-01-2004 (Ξεκινάει και τελειώνει πρίν τον τρέχων μήνα)
Κράτηση 6: Από 11-11-11 Έως 22-11-2011 (Ξεκινάει μετά τον τρέχων μήνα και τελειώνει κάποια στιγμή ακόμα αργότερα).
(START_RES > END_MONTH) OR (END_RES < START_MONTH)
Αλλά δεν χρειάζεσαι τις κρατήσεις 5 και 6, θέλεις όλες εκτός από αυτές.
NOT ( (START_RES > END_MONTH) OR (END_RES < START_MONTH) )
[edit]
Η δικιά μου γνώμη είναι η εξής:
ΑΠΑΓΟΡΕΥΕΤΑΙ ΑΥΣΤΗΡΩΣ ΚΑΙ ΔΙΑ ΡΟΠΑΛΟΥ να χρησιμοποιείται η LIKE για οτιδήποτε άλλο παρά κειμένου. Η ημερομηνία πρέπει να ελέγχεται σαν ημερομηνία.
OR Date_from LIKE '$CUR_MONTH%'
Τα πάντα είναι πιο γρήγορα από το LIKE
'$CUR_MONTH' BETWEEN Date_from AND Date_to
Δεν έχω mysql για να το δοκιμάσω, αλλά αυτό μήπως μετατρέπεται σε κάτι του στύλ:
'2008-06' BETWEEN Date_from AND Date_to;
Συγκρίνεις string με ημερομηνίες και παίζει το between? Κανονικά πρέπει να βαράει μπιέλες.
[/edit]

[edit2]
Στη θέση σου θα δοκίμαζα και με λίγο πιο ακραίες ημερομηνίες για να σιγουρευτώ. Πχ
Κρατήσεις που ξεκινάνε και λήγουν την ίδια μέρα μέσα στον τρέχον μήνα.
Κρατήσεις που ξεκινάνε 5 χρόνια πρίν και λήγουν μέσα στον τρέχον μήνα.
Κρατήσεις που ξεκινάνε 5 χρόνια πρίν και λήγουν 5 χρόνια μετά.
Κρατήσεις που ξεκινάνε μέσα στον τρέχον μήνα και λήγουν 5 χρόνια μετά.
Κρατήσεις που ξεκινάνε/λήγουν τον ίδιο μήνα κάποιας προηγούμενης/επόμενης χρονιάς.
[/edit2]

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από cherouvim » 18 Ιουν 2008 11:44

Η δικιά μου λύση βασισμένη στην ιδέα του dva_dev, και με ευαισθησία στην κατανόηση από τρίτους. Νομίζω κάνει αυτό που θες.

Κώδικας: Επιλογή όλων

select * from reservations 
  where &#40;startDate between '2008-06-01' and last_day&#40;'2008-06-01'&#41;&#41;
     or &#40;endDate   between '2008-06-01' and last_day&#40;'2008-06-01'&#41;&#41;
     or &#40;startDate<'2008-06-01' and endDate>last_day&#40;'2008-06-01'&#41;&#41;;
Επιστρέφει οποιαδήποτε κράτηση έχει σχέση (όπως το εξήγησες παραπάνω) με τον Ιούνιο του 2008:

Κώδικας: Επιλογή όλων

+----+------------+------------+----------------+
| id | startDate  | endDate    | name           |
+----+------------+------------+----------------+
|  1 | 2008-06-10 | 2008-06-11 | inside june    |
|  2 | 2008-03-10 | 2009-01-01 | overlaps june  |
|  4 | 2008-06-04 | 2008-10-12 | starts in june |
|  5 | 2004-05-05 | 2008-06-18 | ends in june   |
|  6 | 2008-06-01 | 2008-06-30 | full june      |
+----+------------+------------+----------------+
Δεν επιστρέφει κρατήσεις που είναι έξω από τον Ιούνιο, και "σπασμένες" κρατήσεις (πχ αρχίζουν το 2009 και τελειώνουν το 2004).

Από την PHP δεσμεύεσαι να στείλεις τον τρέχοντα μήνα σε string έτσι: "2008-06-01"

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 18 Ιουν 2008 17:12

dva_dev έγραψε:
Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα)
Κράτηση 4: Από 14-06-08 Έως 07-07-2008 (Ξεκινάει στον τρέχων μήνα και τελειώνει στον επόμενο)
(START_RES BETWEEN (START_MONTH AND END_MONTH) ) OR
Πιάνει τις κρατήσεις 3 και 4 (δεν το ενδιαφέρει πότε τελειώνει, αρκεί να ξεκινάει μέσα στο μήνα).
Κράτηση 1: Από 22-05-08 Έως 05-06-2008 (Ξεκινάει πριν τον τρέχων μήνα και τελειώνει μέσα σε αυτόν.
Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα)
(END_RES BETWEEN (START_MONTH AND END_MONTH) ) OR
Πιάνει τις κρατήσεις 1 και 3 (δεν το ενδιαφέρει πότε ξεκινάει αρκεί να τελειώνει μέσα στο μήνα).
Κράτηση 2: Από 28-05-08 Έως 08-07-2008 (Ξεκινάει πρίν τον τρέχων μήνα και τελειώνει στον επόμενο)
(START_MONTH BETWEEN (START_RES AND END_RES) )
Πιάνει την κράτηση 2 που ξεκινάει πρίν την αρχή του μήνα και τελειώνει κάποια στιγμή μετά το τέλος του μήνα. Θα μπορούσαμε αντί για START_MONTH να ελέγχουμε το END_MONTH αν θέλουμε, το ίδιο είναι. Αλλά να ελέγχουμε και το START_MONTH και το END_MONTH είναι πλεονασμός.

Βέβαια θα μπορούσαμε να κάνουμε πιο απλή τη ζωή μας και για να γίνει πιο κατανοητό να φέρουμε και τις δύο περιπτώσεις κρατήσεων που μπορεί να υπάρχουν. Εχουμε συνολικά 6 περιπτώσεις
Κράτηση 1: Από 22-05-08 Έως 05-06-2008 (Ξεκινάει πριν τον τρέχων μήνα και τελειώνει μέσα σε αυτόν.
Κράτηση 2: Από 28-05-08 Έως 08-07-2008 (Ξεκινάει πρίν τον τρέχων μήνα και τελειώνει στον επόμενο)
Κράτηση 3: Από 07-06-08 Έως 12-06-2008 (Ξεκινάει και τελειώνει στον τρέχων μήνα.
Κράτηση 4: Από 14-06-08 Έως 07-07-2008 (Ξεκινάει στον τρέχων μήνα και τελειώνει στον επόμενο)
Κράτηση 5: Από 01-01-04 Έως 10-01-2004 (Ξεκινάει κάποια στιγμή και τελειώνει πρίν τον τρέχων μήνα).
Κράτηση 6: Από 11-11-11 Έως 22-11-2011 (Ξεκινάει μετά τον τρέχων μήνα και τελειώνει κάποια στιγμή ακόμα αργότερα).

Εικόνα
Αντί να ψάχνουμε τις 1000 περιπτώσεις που θέλουμε να συμπεριλάβουμε μήπως είναι πιο απλό να του πούμε, φέρε τα πάντα εκτός από τις περιπτώσεις 5 και 6;
Κράτηση 5: Από 01-01-04 Έως 10-01-2004 (Ξεκινάει και τελειώνει πρίν τον τρέχων μήνα)
Κράτηση 6: Από 11-11-11 Έως 22-11-2011 (Ξεκινάει μετά τον τρέχων μήνα και τελειώνει κάποια στιγμή ακόμα αργότερα).
(START_RES > END_MONTH) OR (END_RES < START_MONTH)
Αλλά δεν χρειάζεσαι τις κρατήσεις 5 και 6, θέλεις όλες εκτός από αυτές.
NOT ( (START_RES > END_MONTH) OR (END_RES < START_MONTH) )
[edit]
Η δικιά μου γνώμη είναι η εξής:
ΑΠΑΓΟΡΕΥΕΤΑΙ ΑΥΣΤΗΡΩΣ ΚΑΙ ΔΙΑ ΡΟΠΑΛΟΥ να χρησιμοποιείται η LIKE για οτιδήποτε άλλο παρά κειμένου. Η ημερομηνία πρέπει να ελέγχεται σαν ημερομηνία.
OR Date_from LIKE '$CUR_MONTH%'
Τα πάντα είναι πιο γρήγορα από το LIKE
'$CUR_MONTH' BETWEEN Date_from AND Date_to
Δεν έχω mysql για να το δοκιμάσω, αλλά αυτό μήπως μετατρέπεται σε κάτι του στύλ:
'2008-06' BETWEEN Date_from AND Date_to;
Συγκρίνεις string με ημερομηνίες και παίζει το between? Κανονικά πρέπει να βαράει μπιέλες.
[/edit]

[edit2]
Στη θέση σου θα δοκίμαζα και με λίγο πιο ακραίες ημερομηνίες για να σιγουρευτώ. Πχ
Κρατήσεις που ξεκινάνε και λήγουν την ίδια μέρα μέσα στον τρέχον μήνα.
Κρατήσεις που ξεκινάνε 5 χρόνια πρίν και λήγουν μέσα στον τρέχον μήνα.
Κρατήσεις που ξεκινάνε 5 χρόνια πρίν και λήγουν 5 χρόνια μετά.
Κρατήσεις που ξεκινάνε μέσα στον τρέχον μήνα και λήγουν 5 χρόνια μετά.
Κρατήσεις που ξεκινάνε/λήγουν τον ίδιο μήνα κάποιας προηγούμενης/επόμενης χρονιάς.
[/edit2]
Thank you για την επεξήγηση :)

Σχετικά με το LIKE ήταν πρόχειρη-μπακαλίστικη λύση γιατί με πίεζε ο χρόνος παράδωσης για να δείξω κάτι λειτουργικό (είμαι και φαντάρος και δεν έχω αρκετό χρόνο για να πειραματίζομαι :P)

Για τα υπόλοιπα, με την πρώτη ευκαιρία θα τα τσεκάρω να τα δω και στην πράξη. :wink:

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Select Range of dates between two fields

Δημοσίευση από Cha0s » 27 Ιουν 2008 17:44

Πράγματι το query μου ήταν προβληματικό :P

Σε mysql 4.0.x δεν έφερνε σωστά results.

Το query του Cherouvim έπαιξε άψογα!

Thanks Γιαννη και dva_dev για την βοήθεια :):)

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

[Solved] Select Range of dates between two fields

Δημοσίευση από cherouvim » 21 Ιαν 2011 18:44

Παίζει και ο εξής τρόπος με μικρότερο query:

Κώδικας: Επιλογή όλων

select * from reservations 
  where startDate<last_day&#40;'2008-06-01'&#41; and endDate>'2008-06-01';
Επιστρέφει το ίδιο, απλά με πιο μικρό query. Δηλαδή οτιδήποτε αρχίζει πριν το τέλος Ιουνίου και τελειώνει μετά την αρχή Ιουνίου. Είναι λίγο πιο δύσκολο να συλλάβεις γιατί δουλεύει.

Κώδικας: Επιλογή όλων

+----+------------+------------+----------------+
| id | startDate  | endDate    | name           |
+----+------------+------------+----------------+
|  1 | 2008-06-10 | 2008-06-11 | inside june    |
|  2 | 2008-03-10 | 2009-01-01 | overlaps june  |
|  4 | 2008-06-04 | 2008-10-12 | starts in june |
|  5 | 2004-05-05 | 2008-06-18 | ends in june   |
|  6 | 2008-06-01 | 2008-06-30 | full june      |
+----+------------+------------+----------------+
Επίσης όπως και το προηγούμενο δεν επιστρέφει κρατήσεις που είναι έξω από τον Ιούνιο, και "σπασμένες" κρατήσεις (πχ αρχίζουν το 2009 και τελειώνουν το 2004).

Υπόψιν οτι τα queries δεν δουλεύουν με date inclusive τρόπο, οπότε θέλουν >= και <= αντί για > και <.

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες