/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
BETWEEN to måneder
Fra : "Steen Brølling"


Dato : 18-02-03 11:47

Jeg forsøger følgende i MySQL:

WHERE DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m') AND
DATE_FORMAT(j.dato2, '%m')

Det jeg vil er at finde alle entries mellem f.eks. oktober og maj eller
januar og september. Det sidste vil den godt, men den kan ikke regne den
første ud - altså mellem oktober og så en måned som kommer efter december.

Hvad kan jeg gøre!??

MVH Steen Brølling
--
http://www.broelling.dk (just a little something for the masses)
RedHat 8/Linux 2.4.18 - still think penguins are cute!??

 
 
Jesper Brunholm (18-02-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 18-02-03 12:16

Steen Brølling wrote:
> Jeg forsøger følgende i MySQL:
>
> WHERE DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m') AND
> DATE_FORMAT(j.dato2, '%m')
>
> Det jeg vil er at finde alle entries mellem f.eks. oktober og maj eller
> januar og september. Det sidste vil den godt, men den kan ikke regne den
> første ud - altså mellem oktober og så en måned som kommer efter december.
>
> Hvad kan jeg gøre!??

Hvis det er specifikt for et år kan du lægge et timestamp i og chekke på
intervallet timestamp - timestamp+8md, hvis ikke, kan du lave WHERE
DATE_FORMAT(j.dato2, '%m') IN (månedsliste)

mvh

Jesper Brunholm

--
H.C. Andersen-Centret med nyt design: <http://www.andersen.sdu.dk/>
Phønix - dansk folk-musik fra unge musikere - <http://www.phonixfolk.dk/>


"Steen Brølling" (18-02-2003)
Kommentar
Fra : "Steen Brølling"


Dato : 18-02-03 12:24

Hej

> Hvis det er specifikt for et år kan du lægge et timestamp i og chekke på
> intervallet timestamp - timestamp+8md, hvis ikke, kan du lave WHERE
> DATE_FORMAT(j.dato2, '%m') IN (månedsliste)

Ja det er lige det der er problemet - altså at det ikke er årsspecifikt -
kun månedsspecifikt. Hvis jeg laver det på hele datoer inkl. år og dag
fungerer det fint. Men det kan jeg desværre ikke bruge :(

Månedsliste!?? Hvordan laver man sådan en!??

MVH Steen
--
http://www.broelling.dk (just a little something for the masses)
RedHat 8/Linux 2.4.18 - still think penguins are cute!??

"Steen Brølling" (18-02-2003)
Kommentar
Fra : "Steen Brølling"


Dato : 18-02-03 12:34

> WHERE DATE_FORMAT(j.dato2, '%m') IN (månedsliste)

Altså sådan:

DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m') AND
DATE_FORMAT(j.dato2, '%m') IN (1,2,3,4,5,6,7,8,9,10,11,12)

- eller hvordan!?? Jeg spørger fordi jeg ikke lige kan få det til at
fungere...

MVH Steen

--
http://www.broelling.dk (just a little something for the masses)
RedHat 8/Linux 2.4.18 - still think penguins are cute!??

"Steen Brølling" (18-02-2003)
Kommentar
Fra : "Steen Brølling"


Dato : 18-02-03 14:08

Har også forsøgt følgende:

MONTH(dato) BETWEEN MONTH(j.dato1) AND MONTH(j.dato2)

- med samme ikke brugbare resultat. Hmmmm :(

MVH Steen
--
http://www.broelling.dk (just a little something for the masses)
RedHat 8/Linux 2.4.18 - still think penguins are cute!??

Jesper Brunholm (18-02-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 18-02-03 15:37

Steen Brølling wrote:
>>WHERE DATE_FORMAT(j.dato2, '%m') IN (månedsliste)
>
> Altså sådan:
>
> DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m') AND
> DATE_FORMAT(j.dato2, '%m') IN (1,2,3,4,5,6,7,8,9,10,11,12)

Nej - 'IN' sammenligner lidt i stil med '=', og
<http://www.mysql.com/doc/en/Date_and_time_functions.html> hævder at %m
giver 01 -> 12, så du skal have

DATE_FORMAT(j.dato2, '%m') IN (08,09,10,11,12)

hvis jeg husker syntaks rigtigt, men på samme sider ser jeg at der er
noget der hedder MONTH, som tager en dato som argument og returnerer
1-12, det må da være smartere?

MONTH(j.dato2, '%m') IN (8,9,10,11,12)

virker i min test:

SELECT * FROM `medlemmer` WHERE MONTH(2003BetDato) IN (1,2)

returnerer alle medlemmer der har betalt i jan eller feb 2003

mvh

Jesper Brunholm
--
H.C. Andersen-Centret med nyt design: <http://www.andersen.sdu.dk/>
Phønix - dansk folk-musik fra unge musikere - <http://www.phonixfolk.dk/>


"Steen Brølling" (18-02-2003)
Kommentar
Fra : "Steen Brølling"


Dato : 18-02-03 15:51

Tak for svar Jesper.

> MONTH(j.dato2, '%m') IN (8,9,10,11,12)
> virker i min test:
> SELECT * FROM `medlemmer` WHERE MONTH(2003BetDato) IN (1,2)
> returnerer alle medlemmer der har betalt i jan eller feb 2003

Ja det har jeg også fået til at virke. Problemet er bare, at når årstallet
ikke tages med i min DATE_FORMAT eller MONTH, så kan sqlen ikke regne ud
at oktober i mit første argument (j.dato1) er mindre end maj (et eller flere år
senere) i mit næste argument (j.dato2).

Den kan kun se månedsforskellen, hvis jeg har første argument som en
mindre måned indenfor samme årstal. Altså maj < oktober.

MVH Steen
--
http://www.broelling.dk (just a little something for the masses)
RedHat 8/Linux 2.4.18 - still think penguins are cute!??

Jesper Brunholm (18-02-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 18-02-03 22:59

Steen Brølling wrote:

>>MONTH(j.dato2, '%m') IN (8,9,10,11,12)
>>virker i min test:
>>SELECT * FROM `medlemmer` WHERE MONTH(2003BetDato) IN (1,2)
>>returnerer alle medlemmer der har betalt i jan eller feb 2003
>
>
> Ja det har jeg også fået til at virke. Problemet er bare, at når årstallet
> ikke tages med i min DATE_FORMAT eller MONTH, så kan sqlen ikke regne ud
> at oktober i mit første argument (j.dato1) er mindre end maj (et eller flere år
> senere) i mit næste argument (j.dato2).

Jeg har svært ved at finde ud af hvad det er du vil, dvs skal bruge, så
jeg repeterer lige original-udkastet:

WHERE DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m') AND
DATE_FORMAT(j.dato2, '%m')

den fandt vi så ud af kunne sammen/omskrives til
WHERE MONTH(dato) IN ([månedsliste spændende fra j.dato1 til j.dato2])

Problemet er så at lave det der skal stå i IN, hvis det skal genereres
ud fra de to j. , men jeg forstod på dig at den enten skulle ligge i
perioden oktober-maj eller jan-september. Hvis det er rigtigt forstået
så kan vi lave INs indhold på forhånd, og problemet er løst.

Hvis ikke må vi finde ud af at generere det on the fly, er det fx altid
8 måneder det skal ligge indenfor?

Så - hvad er problemet mere præcist?

mvh

Jesper Brunholm


"Steen Brølling" (19-02-2003)
Kommentar
Fra : "Steen Brølling"


Dato : 19-02-03 18:59

Hej igen

> Jeg har svært ved at finde ud af hvad det er du vil

> Problemet er så at lave det der skal stå i IN, hvis det skal genereres
> ud fra de to j. , men jeg forstod på dig at den enten skulle ligge i
> perioden oktober-maj eller jan-september. Hvis det er rigtigt forstået
> så kan vi lave INs indhold på forhånd, og problemet er løst.

Desværre :(

> Hvis ikke må vi finde ud af at generere det on the fly, er det fx altid
> 8 måneder det skal ligge indenfor?

Nej. Jeg ka' godt se det er skidt forklaret.

Jeg skal kunne finde en record indeholdende en dato (skiftende) indenfor
månedsperioden imellem 2 måneder! Uanset input, årstal med videre -
altså kan der ikke foreligge nogen statiske INs.
I SELECTen hives måske adskillige tusind records ud, som alle
sandsynligvis har forskellige datoer, jdato1er og jdato2er. De vil i hvert
fald aldrig være ens.
Dato ligger i formatet 'YYYY-MM-DD' og jdatoerne ligger i formatet
'0000-MM-00'.

Er det forklaret forståeligt for andre end mig selv? :)

Tak for alle jeres svar allesammen - jeg har ikke tid at lege med det før
weekenden, så jeg skal ha' gang i noget testning! :)

Vender tilbage når jeg er blewn' klogere...

MVH Steen Brølling
--
http://www.broelling.dk (just a little something for the masses)
RedHat 8/Linux 2.4.18 - still think penguins are cute!??

Nis Jorgensen (19-02-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 19-02-03 11:20

On Tue, 18 Feb 2003 15:50:36 +0100, "Steen Brølling" <strix@mail.dk>
wrote:

>Tak for svar Jesper.
>
>> MONTH(j.dato2, '%m') IN (8,9,10,11,12)
>> virker i min test:
>> SELECT * FROM `medlemmer` WHERE MONTH(2003BetDato) IN (1,2)
>> returnerer alle medlemmer der har betalt i jan eller feb 2003
>
>Ja det har jeg også fået til at virke. Problemet er bare, at når årstallet
>ikke tages med i min DATE_FORMAT eller MONTH, så kan sqlen ikke regne ud
>at oktober i mit første argument (j.dato1) er mindre end maj (et eller flere år
>senere) i mit næste argument (j.dato2).
>
>Den kan kun se månedsforskellen, hvis jeg har første argument som en
>mindre måned indenfor samme årstal. Altså maj < oktober.

Prøv denne:


WHERE (MONTH(dato) - MONTH(j.dato1)) mod 12
<= (MONTH(j.dato2)- MONTH(j.dato1)) mod 12

Ikke så selvindlysende som den oprindelige - men efter min mening
bedre end at begynde at rode med IN osv


--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Kristian Damm Jensen (19-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 19-02-03 13:45

Nis Jorgensen wrote:
>
> On Tue, 18 Feb 2003 15:50:36 +0100, "Steen Brølling" <strix@mail.dk>
> wrote:
>
> >Tak for svar Jesper.
> >
> >> MONTH(j.dato2, '%m') IN (8,9,10,11,12)
> >> virker i min test:
> >> SELECT * FROM `medlemmer` WHERE MONTH(2003BetDato) IN (1,2)
> >> returnerer alle medlemmer der har betalt i jan eller feb 2003
> >
> >Ja det har jeg også fået til at virke. Problemet er bare, at når årstallet
> >ikke tages med i min DATE_FORMAT eller MONTH, så kan sqlen ikke regne ud
> >at oktober i mit første argument (j.dato1) er mindre end maj (et eller flere år
> >senere) i mit næste argument (j.dato2).
> >
> >Den kan kun se månedsforskellen, hvis jeg har første argument som en
> >mindre måned indenfor samme årstal. Altså maj < oktober.
>
> Prøv denne:
>
> WHERE (MONTH(dato) - MONTH(j.dato1)) mod 12
> <= (MONTH(j.dato2)- MONTH(j.dato1)) mod 12
>
> Ikke så selvindlysende som den oprindelige - men efter min mening
> bedre end at begynde at rode med IN osv

Elegant.


--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Kristian Damm Jensen (18-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 18-02-03 20:56

"Steen Brølling" " wrote:
>
> Jeg forsøger følgende i MySQL:
>
> WHERE DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m') AND
> DATE_FORMAT(j.dato2, '%m')
>
> Det jeg vil er at finde alle entries mellem f.eks. oktober og maj eller
> januar og september. Det sidste vil den godt, men den kan ikke regne den
> første ud - altså mellem oktober og så en måned som kommer efter december.
>
> Hvad kan jeg gøre!??

WHERE
-- Tilfælde 1: interval inden for et år
DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m')
AND DATE_FORMAT(j.dato2, '%m')
AND DATE_FORMAT(j.dato1, '%m') < AND DATE_FORMAT(j.dato2, '%m')

OR
-- Tilfælde 2: Interval hen over nytår
DATE_FORMAT(dato, '%m') <= DATE_FORMAT(j.dato1, '%m')
AND DATE_FORMAT(dato, '%m') >= DATE_FORMAT(j.dato2, '%m')
AND DATE_FORMAT(j.dato1, '%m') >= AND DATE_FORMAT(j.dato2, '%m')

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Nis Jorgensen (19-02-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 19-02-03 11:26

On Tue, 18 Feb 2003 20:56:13 +0100, Kristian Damm Jensen
<kristian-damm.jensenRE@MOVEcgey.com> wrote:

>
>
>WHERE
>-- Tilfælde 1: interval inden for et år
>DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m')
> AND DATE_FORMAT(j.dato2, '%m')
>AND DATE_FORMAT(j.dato1, '%m') < AND DATE_FORMAT(j.dato2, '%m')
>
>OR
>-- Tilfælde 2: Interval hen over nytår
> DATE_FORMAT(dato, '%m') <= DATE_FORMAT(j.dato1, '%m')
>AND DATE_FORMAT(dato, '%m') >= DATE_FORMAT(j.dato2, '%m')
>AND DATE_FORMAT(j.dato1, '%m') >= AND DATE_FORMAT(j.dato2, '%m')

Den anden del er gal - prøv at checke med nogen eksempler. Derudover
har du et AND for meget.

Slutteligen vil jeg mene at dato1=dato2 bør være indeholdt i den
første gren - altså

DATE_FORMAT(j.dato1, '%m') <= DATE_FORMAT(j.dato2, '%m')

DATE_FORMAT(j.dato1, '%m') > AND DATE_FORMAT(j.dato2, '%m')

- således at det matcher den normale opførsel af "BETWEEN".

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Kristian Damm Jensen (19-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 19-02-03 14:01

Nis Jorgensen wrote:
>
> On Tue, 18 Feb 2003 20:56:13 +0100, Kristian Damm Jensen
> <kristian-damm.jensenRE@MOVEcgey.com> wrote:
>
> >
> >
> >WHERE
> >-- Tilfælde 1: interval inden for et år
> >DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m')
> > AND DATE_FORMAT(j.dato2, '%m')
> >AND DATE_FORMAT(j.dato1, '%m') < AND DATE_FORMAT(j.dato2, '%m')
> >
> >OR
> >-- Tilfælde 2: Interval hen over nytår
> > DATE_FORMAT(dato, '%m') <= DATE_FORMAT(j.dato1, '%m')
> >AND DATE_FORMAT(dato, '%m') >= DATE_FORMAT(j.dato2, '%m')
> >AND DATE_FORMAT(j.dato1, '%m') >= AND DATE_FORMAT(j.dato2, '%m')
>
> Den anden del er gal - prøv at checke med nogen eksempler. Derudover
> har du et AND for meget.
>
> Slutteligen vil jeg mene at dato1=dato2 bør være indeholdt i den
> første gren - altså
>
> DATE_FORMAT(j.dato1, '%m') <= DATE_FORMAT(j.dato2, '%m')
>
> DATE_FORMAT(j.dato1, '%m') > AND DATE_FORMAT(j.dato2, '%m')
>
> - således at det matcher den normale opførsel af "BETWEEN".

Altsammen rigtigt. Der burde have stået

-- Tilfælde 1: interval inden for et år
DATE_FORMAT(dato, '%m') BETWEEN DATE_FORMAT(j.dato1, '%m')
AND DATE_FORMAT(j.dato2, '%m')
AND DATE_FORMAT(j.dato1, '%m') <= DATE_FORMAT(j.dato2, '%m')

OR
-- Tilfælde 2: Interval hen over nytår
( DATE_FORMAT(dato, '%m') <= DATE_FORMAT(j.dato1, '%m')
OR DATE_FORMAT(dato, '%m') >= DATE_FORMAT(j.dato2, '%m'))
AND DATE_FORMAT(j.dato1, '%m') > DATE_FORMAT(j.dato2, '%m')

Men din løsning er stadig den mest elegante, selvom min muligvis er
lettere at forstå.

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste