[php][mysql] datum sorteer probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil graag met php/mysql alle records selecteren ouder dan X dagen.
B.v alle records van eergisteren en eerder.

SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;

Zoiets heb ik geprobeerd in talloze vormen. Maar deze query selecteert alles
van 30 dagen terug en ook records in de toekomst. Gisteren en toekomst wil ik er niet bij hebben. Hoe krijg ik dit voor elkaar.
Ik heb al vanalles geprobeerd maar geen resultaat.

Ik wil het liefst dat de mysql query dit in 1 keer doet. Dus zonder 'php-hulp'

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

van welk datatype is je date_col ?

[ Voor 7% gewijzigd door thomaske op 27-10-2003 22:06 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
is van het typ date YYYY-MM-DD

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Daar moet je een timesamp veld van maken.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Koraalduivel schreef op 27 October 2003 @ 22:10:
Daar moet je een timesamp veld van maken.
Kan je dat ook onderbouwen?
Waarom een timestamp en waarom geen gewone datum?

Mocht de TS alle records willen die de laatste 30 dagen aangepast zijn , dan is een timestamp idd een betere keuze. (Als MySQL natuurlijk die timestamps automatisch aanpast bij een UPDATE).

Wat gebeurt er trouwens in MySQL als je dit doet:
code:
1
SELECT now() - 30 FROM blaat

?

Worden er dan ook 30 dagen van de huidige datum afgetrokken?

[ Voor 45% gewijzigd door whoami op 27-10-2003 22:14 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is idd geen timestamp, maar volgens mij kan dat in een
query direct omgezet worden UNIX_TIMESTAMP(datum)

Maar waar het dus eigenlijk om gaat is dat ik in de query
een startpunt in het verleden kan opgeven, en dat
vanaf dat punt er b.v de records van afgelopen 30 dagen
kan worden weergegeven.

Dus hoe kan ik in een query opgeven om vanaf 3 dagen geleden
records van de laatste 30 dagen weer te laten geven.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Verwijderd schreef op 27 October 2003 @ 22:18:
Het is idd geen timestamp, maar volgens mij kan dat in een
query direct omgezet worden UNIX_TIMESTAMP(datum)
Waarom zou je dat willen omzetten?
Maar waar het dus eigenlijk om gaat is dat ik in de query
een startpunt in het verleden kan opgeven, en dat
vanaf dat punt er b.v de records van afgelopen 30 dagen
kan worden weergegeven.

Dus hoe kan ik in een query opgeven om vanaf 3 dagen geleden
records van de laatste 30 dagen weer te laten geven.
code:
1
2
3
SELECT *
FROM TABEL
WHERE datum BETWEEN ( (datum_sel - 30 dagen) AND datum_sel )

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

whoami schreef op 27 October 2003 @ 22:12:
[...]


Kan je dat ook onderbouwen?
Waarom een timestamp en waarom geen gewone datum?
Timesamp vindt ik in elk geval handiger dan een date omdat een timesamp flexibeler. Maar voor deze functie is het niet strikt noodzakelijk om een timesamp te gebruiken (ik dacht van wel).
Mysql manual:
TO_DAYS(date)
Given a date date, returns a daynumber (the number of days since year 0):

mysql> SELECT TO_DAYS(950501);
-> 728779
mysql> SELECT TO_DAYS('1997-10-07');
-> 729669
Aangezien deze query als voorbeeld wordt genoemd op mysql.com lijkt het me dat de query wel goed zal zijn.
Here is an example that uses date functions. The following query selects all records with a date_col value from within the last 30 days:

mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
Misschien heeft het iets met je tabel/code te maken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Waarom zou je dat willen omzetten?
Nee wil ik niet. Was even een reply op de timestamp genoemd door Koraalduivel

code:
1
2
3
SELECT *
FROM TABEL
WHERE datum BETWEEN ( (datum_sel - 30 dagen) AND datum_sel )


Deze code snap ik niet helemaal. Kun je die misschien toelichten?
datum_sel is waarschijnljik het startpunt, maar volgens
mij accepteert mysql deze format niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
$result = mysql_query(select * from files WHERE date_lastshow 
BETWEEN (NOW() - 30) and (NOW()-3));


Dit werkt b.v niet. Deze geeft ook records weer met de datum van vandaag.

Probeer ik het met b.v DAYOFYEAR:

code:
1
2
select * from galleries WHERE date_lastshow BETWEEN 
(DAYOFYEAR(NOW()) - 30) and (DAYOFYEAR(NOW())-3)


Je zou idd verwachten dat deze records selecteert van 30 dagen geleden tot 3 dagen geleden. Maar geeft bij mij geen resultaat. Wat doe ik fout?

[ Voor 41% gewijzigd door Verwijderd op 27-10-2003 22:43 ]


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Probeer deze query eens:

SQL:
1
2
3
SELECT something
FROM files
WHERE date_lastshow BETWEEN ( TO_DAYS(NOW() AND (TO_DAYS(NOW() -30) )

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dan zou het:

code:
1
BETWEEN TO_DAYS(NOW()-3) AND TO_DAYS(NOW() -30)


moeten worden om een startpunt te creeren. Maar helaas dit selecteert
ook niets.

Acties:
  • 0 Henk 'm!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 01-09 17:44
Ik mischien niet dom over komen hoor maar volgens mij mogen er geen underscores zitten in de naam van een colum.

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Rednek schreef op 27 October 2003 @ 22:55:
Ik mischien niet dom over komen hoor maar volgens mij mogen er geen underscores zitten in de naam van een colum.
Je kunt wel degelijk underscores gebruiken in tabelnamen en kollomnamen.

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Weet je wel wat je vraagt ?

to_days(Now()) stel dat dit 60 is....
to_days(then) .. stel dat dit 20 dagen geleden was.. dus waarde is 40

Volgens jouw eerste query komt dit uit op 60 - 40 = 20... hey ... 20 is kleiner of gelijk aan die 30 in je voorwaarde, dus deze moeten we meegeven.

wat je dus zult moeten doen is de huidige datum van de "then" datum aftrekken.. is dat kleiner dan -30 dan is het ouder dan 30 dagen. ( en die resultaat wou je hebben. )

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

Uhm...misschien denk ik veel te simpel, maar:

PHP:
1
2
3
$timestamp = time() - 172800;
$datum = date(YYYY-MM-DD, $timestamp);
$query = "SELECT * FROM TABEL WHERE timstamp < '" . $datum . "'";


Natuurlijk heb je dan wel hulp van php...Maar het is wel effectief...

Note: de date() functie moet je even naar wens aanpassen

edit:
foutjes....ben moe :S

[ Voor 31% gewijzigd door Roa op 27-10-2003 23:16 ]

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Weet je wel wat je vraagt ?

to_days(Now()) stel dat dit 60 is....
to_days(then) .. stel dat dit 20 dagen geleden was.. dus waarde is 40

Volgens jouw eerste query komt dit uit op 60 - 40 = 20... hey ... 20 is kleiner of gelijk aan die 30 in je voorwaarde, dus deze moeten we meegeven.

wat je dus zult moeten doen is de huidige datum van de "then" datum aftrekken.. is dat kleiner dan -30 dan is het ouder dan 30 dagen. ( en die resultaat wou je hebben. )
Zou je dit misschien in een query kunnen omschrijven, want ik zou niet gelijk weten hoe die er dan uit moet komen te zien.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Uhm...misschien denk ik veel te simpel, maar:

<?
$timestamp = time() - 172800;
$datum = date(YYYY-MM-DD, $timestamp);
$query = "SELECT * FROM TABEL WHERE timstamp < '" . $datum . "'";
?>


Natuurlijk heb je dan wel hulp van php...Maar het is wel effectief...

Note: de date() functie moet je even naar wens aanpassen
Het mooiste zou natuurlijk zijn om dit in een query op te lossen.
Dit werkt overigens niet.

select * from test where datum <'2003-11-11'

b.v werkt niet. Moet hier nog iets voor om het als datum aan te duiden?
Het veld is geen timestamp, anders was het wat makkelijker geweest.

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Verwijderd schreef op 27 October 2003 @ 23:19:
[...]
Zou je dit misschien in een query kunnen omschrijven, want ik zou niet gelijk weten hoe die er dan uit moet komen te zien.
Ik ga geen exacte query geven je kan het in principe uit het verhaaltje halen wat je moet doen.

bla bla ... waar (aantaldagen(toen)-aantaldagen(nu))<=-(aantal dagen)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok ik snap watje bedoeld. Maar:

code:
1
2
select * from galleries WHERE (TO_DAYS(date_lastshow)-
TO_DAYS(NOW())) \<= -3


geeft bij mij geen resultaat.

[ Voor 5% gewijzigd door Verwijderd op 28-10-2003 00:15 ]


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

en als je where 1=1 doet en de to_days(then)-to_days(now()) in de select zelf gooit, welke waarde's komen dan daar allemaal uit ?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Excuus, je bewering is volkomen juist:

code:
1
2
mysql_query('select id,id_user from galleries WHERE
(TO_DAYS(date_lastshow)-TO_DAYS(NOW())) <= -3");


Dit is de uiteindelijke code die werkt.

Thanks Dusty & de rest

[ Voor 21% gewijzigd door Verwijderd op 28-10-2003 00:59 ]

Pagina: 1