Εξαγωγή αποτελεσμάτων βάσει dateline

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

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

Απάντηση
Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 10 Ιουν 2013 23:16

Γεια σας παιδιά!
Λοιπόν, θέλω να μου εξηγήσετε μερικά πράγματα σχετικά με την επιστροφή στοιχείων βάσει χρόνου.

Ας πούμε ότι θέλω να εξάγω τα TOP στοιχεία της ημέρας. Το column "dateline" έχει τη σφραγίδα χρόνου στον πίνακα με τα στοιχεία μας.
Αν βάλω αυτή τη WHERE, επιστρέφονται τα στοιχεία των τελευταίων 24 ωρών.
WHERE (FROM_UNIXTIME(dateline) > CURDATE() - INTERVAL 24 HOUR)

Με ποια WHERE θα επιστρέψω τα στοιχεία της ημέρας;
Δηλαδή αν η ώρα πάει 12:01, τα αποτελέσματα που θα επιστρέφονται θα πρέπει είναι ελάχιστα και σιγά σιγά θα αυξάνονται.

Επίσης με ποια WHERE εξάγω τα TOP στοιχεία για "χθες";

Ευχαριστώ!

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από fafos » 10 Ιουν 2013 23:46

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

DATE(from_unixtime(dateline)) = CURRENT_DATE
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 11 Ιουν 2013 12:20

Σε ευχαριστώ! Το δοκίμασα και απ' ότι φαίνεται επιστρέφει τα σωστά αποτελέσματα.

Θα ήθελα αν μπορεί κάποιος και την WHERE για:
α) τα "χθεσινά" στοιχεία
β) τα στοιχεία της τελευταίας εβδομάδας
γ) τα στοιχεία του τελευταίου μήνα

Δηλαδή όταν η ημέρα πάει Κυριακή, τα στοιχεία της εβδομάδας θα πρέπει να είναι ελάχιστα και σιγά σιγά μέσα στην εβδομάδα θα αυξάνονται. Το ίδιο και όταν η μήνας πάει 1η, για το γ)

Ευχαριστώ!

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6230
Εγγραφή: 30 Νοέμ 2004 03:09

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από fafos » 11 Ιουν 2013 16:51

xthes:

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

DATE(from_unixtime(dateline)) =  DATE_SUB(CURRENT_DATE,INTERVAL 1 DAY)
evdomadas me proth mera thn kyriakh:

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

YEARWEEK(from_unixtime(dateline), 0) =  YEARWEEK(CURRENT_DATE, 0)
(oi arithmoi 0 dhlonoun enarxh evdomadas thn kyriakh.. an htan 1 tha ksekinouse apo Deutera, 2 apo trith klp)

mhnas:

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

MONTH(from_unixtime(dateline)) = MONTH(CURRENT_DATE)
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 15 Απρ 2014 13:03

Γεια σας και πάλι παιδιά!
Χρειάζομαι τη βοήθειά σας στη σύνταξη άλλης μιας WHERE σχετικά με χρόνους (timestamp - days).

Έχουμε τον πίνακα thread με columns μεταξύ άλλων:
dateline (το timestamp που δημιουργήθηκε το θέμα)
closing_timer_days (ένας αριθμός ημερών)

closing_timer_days περιέχει τον αριθμό των ημερών (πχ 3), οι οποίες όταν περάσουν από τη στιγμή δημιουργίας (δηλαδή μετά το dateline), το θέμα θα κλειδώνει.

Θέλω λοιπόν να επιλέξω τα θέματα που είναι προς κλείδωμα. Το:

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

(CURRENT_TIMESTAMP() - (closing_timer_days * 86400)) >= dateline
.. στη WHERE δεν μου δουλεύει σωστά :(

Μαζί με την απάντηση - όσοι γνωρίζετε - θα ήθελα να μου επισημάνετε και το λάθος στη δική μου WHERE.

Και κάτι τελευταίο, αν θέλω να επιλέξω τα threads που κλείνουν σύντομα (δηλαδή σε 60 λεπτά ή λιγότερο από "τώρα", τι μπορώ να βάλω στη WHERE ; ).

Ευχαριστώ εκ των προτέρων

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 15 Απρ 2014 13:56

Το current_timestamp είναι το ίδιο με το now(), οπότε τσέκαρε μόνο αυτό:
NOW()

Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone.

mysql> SELECT NOW();
-> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 20071215235026.000000
δηλαδή αν δουλεύεις με string ή αριθμό στο dateline γιατί το πρώτο κομμάτι είναι σίγουρα αριθμητικό. Το πεδίο dateline τι τύπος είναι; timestamp; Το closing_timer_days είναι int;

Σε κάτι παρόμοιο, αυτό μου δουλεύει μια χαρά:

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

WHERE timestamp_column >= NOW() - 10000

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 15 Απρ 2014 13:58

alou έγραψε: δηλαδή αν δουλεύεις με string ή αριθμό στο dateline γιατί το πρώτο κομμάτι είναι σίγουρα αριθμητικό. Το πεδίο dateline τι τύπος είναι; timestamp; Το closing_timer_days είναι int;
Το dateline είναι unix timestamp και το closing_timer_days είναι πράγματι integer. :)

Οπότε;

edit: το ακόλουθο δεν δουλεύει σε μένα:

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

&#40;NOW&#40;&#41; - &#40;closing_timer_days * 86400&#41;&#41; =< dateline 

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 15 Απρ 2014 14:36

Το now με την πράξη γίνεται αριθμός γιαυτό στο έγραψα, πρέπει να τα κάνεις και τα δυο ίδια, πχ χρησιμοποιόντας interval

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


select * from table WHERE dateline >= &#40;NOW&#40;&#41; - INTERVAL `closing` DAY&#41;
EDIT:
Τώρα πρόσεξα και κάτι που μάλλον θα σε βοηθήσει, το now() όπως και το current_timestamp βεβαια δεν είναι unix timestamp, είναι ημερομηνίες, είτε με - είτε χωρίς ανάλογα, αν ήθελες να το δουλέψεις με UNIX timestamp οπότε και ισχύει η αφαίρεση του 86400, θα επέλεγες

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

... WHERE UNIX_TIMESTAMP&#40;dateline&#41; >= &#40;UNIX_TIMESTAMP&#40;&#41; - closing * 86400&#41;

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 15 Απρ 2014 15:48

Τα δοκίμασα τα παραπάνω αλλά μάλλον δε μου δούλεψαν (στις προσπάθειες δοκίμασα το παρακάτω και με διάφορες δοκιμές στις ημερομηνίες της database και του localhost μου, απ' ότι φαίνεται δουλεύει σωστά) :

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

FROM_UNIXTIME&#40;dateline&#41; <= &#40;CURDATE&#40;&#41; - INTERVAL `closing` DAY&#41;
Πως σου φαίνεται;
Μήπως κάναμε λάθος στο σύμβολο σύγκρισης;
Γιατί με το <= μου δουλεύει σωστά, ενώ με το >= όχι.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 15 Απρ 2014 16:04

Για να είναι πιο εύκολο στη σκέψη, λέω

η μέρα που το δημοσίευσα + το διάστημα που θέλω να είναι στον αέρα >= του τώρα

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

μέρα δημοσίευσης >= τώρα - διάστημα που μένει

Σωστό το from_unixtime αν έχει unix timestamp τιμή, δεν κάνεις ένα show create table `tablename` να το δούμε?

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 15 Απρ 2014 17:53

alou έγραψε:Για να είναι πιο εύκολο στη σκέψη, λέω

η μέρα που το δημοσίευσα + το διάστημα που θέλω να είναι στον αέρα >= του τώρα

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

μέρα δημοσίευσης >= τώρα - διάστημα που μένει

Σωστό το from_unixtime αν έχει unix timestamp τιμή, δεν κάνεις ένα show create table `tablename` να το δούμε?
Τι είναι η εντολή show create table `tablename` και τι θα μας δείξει;

Με δοκιμαστικά αυτά τα δεδομένα:
threadid = 7291, dateline = 1397487600 (δηλαδή 14/4/2014 15:00), closing = 4

Το:

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

FROM_UNIXTIME&#40;dateline&#41; <= &#40;CURDATE&#40;&#41; - INTERVAL `closing` DAY&#41;
.. σήμερα 15/4 δεν επιστρέφει τίποτα
.. μέχρι 18/4 δεν επιστρέφει τίποτα
.. 19/4 επιστρέφει το threadid 7291

Το:

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

FROM_UNIXTIME&#40;dateline&#41; >= &#40;CURDATE&#40;&#41; - INTERVAL `closing` DAY&#41;
.. σήμερα 15/4 μου επιστρέφει το threadid 7291
.. μέχρι 18/4 επιστρέφει το threadid 7291
.. 19/4 δεν επιστρέφεται τίποτα

Εγώ με το query δε θέλω να επιλέξω αυτά που είναι στον αέρα, αλλά αυτά που είναι προς κλείδωμα ώστε να τα κλειδώσω.
Επομένως το σωστό στην περίπτωσή μου είναι το <= ή κάτι άλλο παίζει με τα στοιχεία της WHERE;

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

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από dva_dev » 15 Απρ 2014 19:02

Αυτό που χρειάζεσαι είναι το <=

Αυτό που θα έλεγα να προσέξεις είναι το αν σε ενδιαφέρει η ώρα και το αν θέλεις <= ή απλώς <

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 15 Απρ 2014 20:05

dva_dev έγραψε:Αυτό που χρειάζεσαι είναι το <=

Αυτό που θα έλεγα να προσέξεις είναι το αν σε ενδιαφέρει η ώρα και το αν θέλεις <= ή απλώς <
Ναι, με ενδιαφέρει και η ώρα, οπότε χρησιμοποιώ <=

Και κάτι άλλο, αν θέλω να επιλέξω τα θέματα που κλείνουν εντός μιας ώρας ώστε να τα μαρκάρω ως closing_soon, τι WHERE θα χρειαστώ; Θα πρέπει μήπως να βάλω και ένα INTERVAL 1 HOUR μέσα στην πράξη (να το προσθέσω ή να το αφαιρέσω) ή κάτι άλλο;

Επίσης αν θέλω να κάνω το παραπάνω, αλλά αντί για 1 HOUR θέλω αυτά που κλείνουν εντός 65 λεπτών, πως το ορίζω; Με INTERVAL 65 MINUTE;

Ευχαριστώ :)

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από alou » 16 Απρ 2014 08:04

Ναι βέβαια αφού διαλέγεις αυτά που είναι για κλείδωμα, θες less than.
Αν σε ενδιαφέρει και η ώρα, δεν θα χρησιμοποιήσεις curdate() αλλά now() και ανάλογα με την ερμηνεία που έχει το closing θα χρησιμοποιήσεις το < ή το <= , είναι 2 διαφορετικά πράγματα αυτά που σου είπε ο dva_dev.

Άβαταρ μέλους
philos
Δημοσιεύσεις: 260
Εγγραφή: 30 Αύγ 2007 23:32

Εξαγωγή αποτελεσμάτων βάσει dateline

Δημοσίευση από philos » 16 Απρ 2014 13:09

a ok για κάποιο λόγο νόμιζα ότι η ακρίβεια σε ώρες/λεπτά προσδιοριζόταν από το ίσον ( = ). Αλλιώς τι διαφορά έχει το < με το <= στη πράξη;
Θα το δοκιμάσω με NOW() και θα σας πω. :)

Αν μπορείτε δείτε και την άλλη μου ερώτηση στο ακριβώς από πάνω μήνυμα για το closing_soon.

Απάντηση

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

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

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