Avatar billede straszek Praktikant
13. februar 2008 - 19:26 Der er 26 kommentarer og
1 løsning

finde datoer i en bestemt måned

Jeg har en event-kalender i min mysql-database. I den er det et felt der angiver dato - et unixtimestamp felt. Er det muligt at lave et mysql udtræk der finder alle events i f.x. marts måned?

Jeg ved jeg kan gør det i php med $find= date("m", $dato); - men det vil spare lidt tid hvis det kunne gøres direkte i udtrækket
Avatar billede kjeldsted Novice
13. februar 2008 - 20:44 #1
Det nemmeste ville da nok være at angive datoen i en anden format end unix time stamp. Fx. yyyy-mm-dd hh:mm:ss, og så hente informationer hvor mm=02...
Avatar billede jakobdo Ekspert
13. februar 2008 - 21:37 #2
Du bør klart anvende: DATETIME
Der kan du så bruge mysql funktionen MONTH(dato_felt) den giver sjovt nok MÅNED 1-12 :o)
Avatar billede limemedia Nybegynder
14. februar 2008 - 03:21 #3
Du kan sagtens bruge dato funktionerne på et timestamp
Samtidig, husk at slå op på både måned og år, ellers gentager dine events sig hvert år

SELECT *
FROM tabel
WHERE MONTH(timestampfelt) = '3' && YEAR(timestampfelt) = '2008'
Avatar billede straszek Praktikant
14. februar 2008 - 08:20 #4
Limemedia> Det lyder smart - det virker bare ikke, nedenståend skulle finde mindst 150 poster, men finder intet:
SELECT *
FROM nyheder
WHERE MONTH(oprettet) = '12' && YEAR(oprettet) = '2007'
Avatar billede jakobdo Ekspert
14. februar 2008 - 08:21 #5
Prøv at fjern '' omkring 12 og 2007
Avatar billede limemedia Nybegynder
14. februar 2008 - 08:26 #6
lav en
SELECT MONTH(oprettet), YEAR(oprettet)
FROM nyheder

så kan du se om der er data i basen og om det virker
Avatar billede straszek Praktikant
14. februar 2008 - 08:37 #7
det give en masse MONTH (null), YEAR(null)
Avatar billede limemedia Nybegynder
14. februar 2008 - 08:46 #8
Jeg testede på en mySQL 5.0.45
Avatar billede straszek Praktikant
14. februar 2008 - 09:16 #9
Jeg er ikke nået længere end til  4.1.20
Avatar billede showsource Seniormester
14. februar 2008 - 10:25 #10
SELECT *
FROM `nyheder`
WHERE MONTH(FROM_UNIXTIME(`oprettet`)) = 12 && YEAR(FROM_UNIXTIME(`oprettet`)) = 2007
Avatar billede showsource Seniormester
14. februar 2008 - 10:28 #11
Om man bruger et datetimefelt eller sekunder siden 1-1-1970 er lidt en smagsag
Det er nok mere et spm. om havd det skal bruges til.
Avatar billede showsource Seniormester
14. februar 2008 - 10:54 #12
B.t.w. ville det være bedre i ex. at bruge

$start = strtotime("2007-12-01");
$slut = strtotime("2008-01-01");


SELECT *
FROM `nyheder`
WHERE `oprettet` > ". (int)$start ." AND `oprettet` < ". (int)$slut
Avatar billede straszek Praktikant
14. februar 2008 - 20:56 #13
showsource> det virker perfekt, smid et svar
Avatar billede showsource Seniormester
15. februar 2008 - 04:50 #14
Ingen point, ellers tak.
Nu bruger du vel sidste ex. ?
Der er jo ingen grund til at mysql skal løbe alle rækker igennem og foretage 2*2 "formateringer"
Avatar billede straszek Praktikant
15. februar 2008 - 07:26 #15
Jeg bruger: SELECT *
FROM `nyheder`
WHERE MONTH(FROM_UNIXTIME(`oprettet`)) = 12 && YEAR(FROM_UNIXTIME(`oprettet`)) = 2007

Jeg må indrømme at jeg ikke forstår hvad du mener med denne:
$start = strtotime("2007-12-01");
$slut = strtotime("2008-01-01");


SELECT *
FROM `nyheder`
WHERE `oprettet` > ". (int)$start ." AND `oprettet` < ". (int)$slut

Hvad skal start & slut gøre godt for?
Avatar billede showsource Seniormester
15. februar 2008 - 07:39 #16
Du ved hvilken måned og år du vil ha' vist. ( 12 og 2007 )
( hvordan du så end bestemmer det )

Den query du bruger lige nu,

"formaterer" først dit felt med FROM_UNIXTIME() og derefter MONTH()

Det er der jo ingen grund til, når du kan få sekunder med strtotime()
Så selecter du hvad som findes inden for $start og $slut
Avatar billede straszek Praktikant
15. februar 2008 - 08:34 #17
måned og år kommer fra $_GET

år hedder f.x. 2007 og måned hedder f.x. 1

Hvordan skal jeg sætte det ind i dit eksempel?
Avatar billede jakobdo Ekspert
15. februar 2008 - 09:21 #18
Du skal starte med:

if(isset($_GET['aar']) && isset($_GET['maaned']) && is_numeric($_GET['aar']) && is_numeric($_GET['maaned'])){
  $aar = intval($_GET['aar']);
  $maaned = intval($_GET['maaned']);
}

Så skal der laves kode som tager den første i måneden og derefter den første i næste måned.

Igen, overvej DATETIME, så har du det meget smartere fra start.
Det koster måske noget tid at lave din kode om, men du får det igen på lang sigt.
Avatar billede straszek Praktikant
15. februar 2008 - 12:13 #19
Jeg forstår godt at det vil være smart at skifte til datetime, det er bare ikke en mulighed lige p.t., men jeg vil gøre det på sigt, men lige nu bliver jeg nødt til at arbejde videre med unixtimestamp
Avatar billede straszek Praktikant
31. marts 2008 - 14:41 #20
vil showsource & jakobdo smide et svar?
Avatar billede jakobdo Ekspert
31. marts 2008 - 21:19 #21
Svar!
Avatar billede showsource Seniormester
01. april 2008 - 08:45 #22
Som sagt, ingen point, ellers tak
Avatar billede michael_stim Ekspert
01. april 2008 - 08:50 #23
Nu har jeg ikke læst tråden igennem, men kan se i har brugt programmeringsoperatore i SQL'en. && = AND

Jeg bruger: SELECT *
FROM `nyheder`
WHERE MONTH(FROM_UNIXTIME(`oprettet`)) = 12 Her->&& YEAR(FROM_UNIXTIME(`oprettet`)) = 2007
Avatar billede jakobdo Ekspert
01. april 2008 - 20:54 #24
&& = AND
|| = OR

Same Same, but different.
Avatar billede michael_stim Ekspert
01. april 2008 - 21:32 #25
Ved man kan i PHP, men vidste ikke man kunne i MySQL. Det er i hvert fald ikke SQL standard.
Avatar billede jakobdo Ekspert
01. april 2008 - 21:39 #26
Avatar billede jakobdo Ekspert
01. april 2008 - 21:39 #27
Ikke at MYSQL er SQL standard. :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester