Προς το περιεχόμενο

SQL πως να κανω το ερωτημα


ΠάρηςΓ

Προτεινόμενες αναρτήσεις

Δημοσ.

Ας υποθεσουμε οτι εχω ενα τραπεζι με πρωτευων κλειδακι και μια ωρα εναρξης και μια ωρα τερματισμού.. Αγνοούμε ημερομηνιες κτλ....

 

Αν θελω τωρα να εισαγω μια νεα ωρα εναρξης και τερματισμου πρεπει να μην πέφτει πάνω σε αλλο υπάρχον διαστημα...

Αυτο ειναι ευκολο να το κάνω ελεγχοντας με μια συνθηκη...

 

Το προβλημα ειναι στην περιπτωση που δεν μπορει να χωρεσει αυτο το διαστημα να προτείνει κάποια ώρα που χωράει αυτο το διαστημα.... ΠΡΙΝ και ΜΕΤΑ απο την επιθυμητη ωρα εναρξης...

Καμια ιδέα πως θα μπορουσε να γινει ενα τετοιο ερώτημα;

 

Σιγουρα πιστευω πως θα πρεπει να γινει πολλαπλασιαμός με τον ιδιο πίνακα...

 

Αλλιως η αλλη λυση ειναι να παει μεσω κώδικα..

Δημοσ.
Ας υποθεσουμε οτι εχω ενα τραπεζι με πρωτευων κλειδακι και μια ωρα εναρξης και μια ωρα τερματισμού.. Αγνοούμε ημερομηνιες κτλ....

 

Αν θελω τωρα να εισαγω μια νεα ωρα εναρξης και τερματισμου πρεπει να μην πέφτει πάνω σε αλλο υπάρχον διαστημα...

Αυτο ειναι ευκολο να το κάνω ελεγχοντας με μια συνθηκη...

 

Το προβλημα ειναι στην περιπτωση που δεν μπορει να χωρεσει αυτο το διαστημα να προτείνει κάποια ώρα που χωράει αυτο το διαστημα.... ΠΡΙΝ και ΜΕΤΑ απο την επιθυμητη ωρα εναρξης...

Καμια ιδέα πως θα μπορουσε να γινει ενα τετοιο ερώτημα;

 

Σιγουρα πιστευω πως θα πρεπει να γινει πολλαπλασιαμός με τον ιδιο πίνακα...

 

Αλλιως η αλλη λυση ειναι να παει μεσω κώδικα..

 

Κώδικας. Αν δεν ταιρίαζει μεταξύ δύο ωρών να προτείνει ανάλογα με το τί θες εσύ.

 

Αν ήταν για ημερομηνίες και ώρες, (slots) και αναφερόσουν σε .ΝΕΤ θα έκανες rendering ένα calendar και ένα πίνακα με τις διαθέσημες μέρες και ώρες ανάλογα την ημερομηνία ακόμα και περιοχή βάση ταχυδρομικού κώδικα κλπ.

 

Από εκεί και μετά αν θες περισσότερη βοήθεια πρέπει να γίνεις πιο σαφής.

Δημοσ.

Σε php θα το κανω...Απλα σκεφτομουν μηπως εκανα καποιο super duper query και μου εβρισκε όσα ραντεβου ειχαν κενά μεταξύ τους ανω του slot με αρχικο το ποιο κοντινο στην ωρα που διαλεξα..Αλληλοεπικαλυψη δεν ειναι θεμα γιατι υπαρχει διαχωρισμός.

 

Σε κωδικα ποιος ειναι καλός τροπος;

Ιδέα

Να παιρνω ταξινονομιμενες τις ωρες των ραντεβου(ευκολο μιας και δεν υπαρχει αλληλοεπικάλυψη) απο την βασουλα .. Μετα αν δεν υπαρχει τιποτες να γινεται κανονικα καταχωρηση..

Αν υπάρχει κάποια κατι να γινεται ελεγχος εαν μπορει να γινει την ζητουμενη ωρα..

(Λούπα να ελεγχει)

Αλλιως μετα να ψαχνει να βρει την προηγουμενη και μετα την επομενη...

 

Παλι λοοπαρισμα απο το σημειο που υπήρχε η αλλη προς τα πισω κ ελεγχος αν υπαρχει διαθεσιμο...

Και αντιστοιχα για μπροστα...

Το ρωτημα ειναι αν υπαρχει καποιος αλλος τροπος και αν υπαρχει τροπος να μη γραφω τον ιδιο κωδικα για μπρος και πισω με μονες αλλαγες τα προσημα κτλ...

Στη C νομιζω πως υπαρχει κατι.Αλλα και στη php αν περασω ως παραμετρο αφαίρεση ή προσθεση κατι γινεται...

πχ...

 

Α +prosimo*B prosimo=1 ή -1 αναλογα

Δημοσ.

Θές να κάνεις εγγραφές στον πίνακα μόνο άν το διάστημα που θα κάνεις εγγραφές δεν συμπέφτει μέσα στα διάστηματα που έχει ήδη ο πίνακας;

 

insert into table key, starttime, endtime (select value1, value2, value3

from table where (value2< value3 and value3 < starttime)

or (value3> value2 and value2> endtime))

 

Δοκίμασε το παραπάνω αλλά δεν ξέρω άν βοηθάει :)

Τα value1, value2, value3 πέρνα τα σαν παραμέτρους.

Δημοσ.

Μπορείς να φτιάξεις ένα Procedure ή Function στην MySQL και να χρησιμοποιείς αυτό.

 

---------- Προσθήκη στις 05:41 ---------- Προηγούμενο μήνυμα στις 04:00 ----------

 

Δες λίγο και αυτό το query. Είναι λίγο κατεβατό αλλά δοκίμασε το μπορεί να σου κάνει τη δουλειά. Σου επιστρέφει 0 αν το πεδίο σου είναι ελέυθερο.

Το δοκίμασα με 3 εγγραφές: 1/7-3/7, 8/7-10/7 και 18/7-20/7. Το διάστημα που ήθελα να εισάγω όπως βλέπεις είναι 4/7-15/7. Προφανώς δεν μπορώ να εισάγω. Αν το αλλάξεις 4/7-7/7 σου επιστρέφει 0.

 

select count(start) from tbl where

 

date(start)='2010-07-4'

or

date(end)='2010-07-4'

or

(

date(start)<'2010-07-4'

and

date(end)>'2010-07-4'

)

 

or

 

date(start)='2010-07-15'

or

date(end)='2010-07-15'

or

(

date(start)<'2010-07-15'

and

date(end)>'2010-07-15'

)

 

or

 

(select min(dayofyear(start)) from tbl where dayofyear(start)>dayofyear('2010-07-4'))<dayofyear('2010-07-15')

;

 

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

Το τρίτο μέρος ελέγχει εάν μεταξύ της αρχής του διαστήματος σου και του τέλους υπάρχει κάποιο άλλο.

 

Δεν ξέρω αν είναι 100% σωστό, σε εμένα στα πρόχειρα δούλεψε.

Μπορείς να το βελτιστοποιήσεις και να το μικρύνεις αν θέλεις.

 

Δοκίμασε και τη λύση του attsifte μπορεί να σε βολέψει καλύτερα.

Δημοσ.
Τι ειναι τα value1 κτλ;

Ναι αυτο θελω να κανω που ειπες..Αλλα να προτείνει το κοντινοτερο διαθεσιμο κιολας..

Value1 είναι το κλειδί που θέλεις να κάνεις insert και value2 και value3 ώρα έναρξης και τερματισμού αντίστοιχα.

Αρχειοθετημένο

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

  • Δημιουργία νέου...