/ 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
[MySQL] Hentning af dato før, nu og eft
Fra : Martin


Dato : 15-04-05 02:01

Hejsa...

Jeg har et lille problem
jeg har 2 felter i min tabel start_dato og slut_dato
begge 2 af typen DATE - Datoen kan være en dato eller 0000-00-00

Jeg skal have 3 SELECT's
en før, efter og nu

FØR er alle dem med start og slut dato før nu og IKKE 0000-00-00

NU er alle dem med start før nu og slut dato efter nu OG 0000-00-00

og EFTER er alle dem med start og slut dato efter nu og IKKE 0000-00-00

Rimelig nemt faktisk - men mine 3 selects ser således ud:

Før:
WHERE (start_dato != '0000-00-00' AND slut_dato != '0000-00-00') AND
(start_dato < NOW() AND slut_dato < NOW())

Efter:
WHERE (start_dato != '0000-00-00' AND slut_dato != '0000-00-00') AND
(start_dato > NOW() AND slut_dato > NOW())

og Nu:
WHERE (start_dato = '0000-00-00' AND slut_dato = '0000-00-00') OR
(start_dato >= NOW() AND slut_dato <= NOW())


men der er noget galt - jeg tror jeg vender < og > forkert - men kan
bare ikk finde problemet :(

 
 
Jens Koldbæk (15-04-2005)
Kommentar
Fra : Jens Koldbæk


Dato : 15-04-05 10:01

Martin <news@natten-i.dk> skrev:
>men der er noget galt - jeg tror
>jeg vender < og > forkert - men kan
>bare ikk finde problemet :(

Prøv

Nu:
WHERE (start_dato = '0000-00-00'
AND slut_dato = '0000-00-00') OR
(start_dato <= NOW() AND slut_dato >= NOW())


Kristian Damm Jensen (15-04-2005)
Kommentar
Fra : Kristian Damm Jensen


Dato : 15-04-05 10:12

Martin wrote:
> Hejsa...
>
> Jeg har et lille problem
> jeg har 2 felter i min tabel start_dato og slut_dato
> begge 2 af typen DATE - Datoen kan være en dato eller 0000-00-00
>
> Jeg skal have 3 SELECT's
> en før, efter og nu
>
> FØR er alle dem med start og slut dato før nu og IKKE 0000-00-00
>
> NU er alle dem med start før nu og slut dato efter nu OG 0000-00-00
>
> og EFTER er alle dem med start og slut dato efter nu og IKKE
0000-00-00
>
> Rimelig nemt faktisk - men mine 3 selects ser således ud:
>
> Før:
> WHERE (start_dato != '0000-00-00' AND slut_dato != '0000-00-00') AND
> (start_dato < NOW() AND slut_dato < NOW())
>
> Efter:
> WHERE (start_dato != '0000-00-00' AND slut_dato != '0000-00-00') AND
> (start_dato > NOW() AND slut_dato > NOW())
>
> og Nu:
> WHERE (start_dato = '0000-00-00' AND slut_dato = '0000-00-00') OR
> (start_dato >= NOW() AND slut_dato <= NOW())
>
>
> men der er noget galt - jeg tror jeg vender < og > forkert - men kan
> bare ikk finde problemet :(


Ja, der er noget frygteligt galt.

Du har fire forskellige betingelse:
(A) start_dato = '0000-00-00'
(B) slut_dato = '0000-00-00'
(C) start_dato < NOW()
(D) slut_dato < NOW()

Det giver 2^4 forskellige kombinationsmuligheder (vi ser lige bort fra
at du både har < NOW() og <= NOW() ) og du har lang fra dækket dem
allesammen. Nogle af dem giver naturligvis ikke mening, eftersom man
må gå ud fra, at start_dato <= slut_dato, men jeg tror alligevel, at
der er huller.

Forsøg i stedet førlgende tilgang:
Ser vi bort fra muligheden '0000-00-00' har du tre muligheder, der er
interessante:

NOW() < start_dato -- Før
start_dato <= NOW() and NOW() <= slut_dato -- Nu
slut_dato < NOW() -- Efter

Dette er den grundlæggende opdeling. Herefter kan du tilføje
sammenligning med '0000-00-00'. Problemet er her naturligvis, hvordan
det skal fortolkes, når en dato ikke er angivet, og specielt når
datoen i den ene ende af interevallet ikke er angivet.

Din beskrivelse er ikke fuldstændig klokkeklar, men jeg ville forsøge
mig med:

-- Før
NOW()< start_dato
AND start_dato <> '0000-00-00'
AND slut_dato <> '0000-00-00'

-- Nu
(start_dato <= NOW() and NOW() <= slut_dato )
OR start_dato = '0000-00-00'
OR slut_dato = '0000-00-00'

-- Efter
slut_dato < NOW()
AND start_dato <> '0000-00-00'
AND slut_dato <> '0000-00-00'

Dette dækker i al fald alle kombinationer uden overlap, og kan tolkes
som værende i overenstemmelse med din beskrivelse ovenfor.

VH
Kristian


Lars Sherman Christe~ (16-04-2005)
Kommentar
Fra : Lars Sherman Christe~


Dato : 16-04-05 16:27

Martin wrote:
> Hejsa...
>
> Jeg har et lille problem
> jeg har 2 felter i min tabel start_dato og slut_dato
> begge 2 af typen DATE - Datoen kan være en dato eller 0000-00-00

Hej Martin

Hvordan kan en dato være 0000-00-00. Jeg er ret sikker på, at når du
definerer et felt med typen DATE, vil 0000-00-00 være invalid. Skulle du
ikke overveje at bruge null, hvis det er en indikation af at datoen ikke
er defineret?

Hvis du ikke bryder dig om at bruge null, så kan du overveje at bruge
0001-01-01 i start_dato og 9999-12-31 i slut_dato.

Venlig hilsen
Lars

Troels Arvin (16-04-2005)
Kommentar
Fra : Troels Arvin


Dato : 16-04-05 17:19

On Sat, 16 Apr 2005 17:27:03 +0200, Lars Sherman Christensen wrote:
> Hvordan kan en dato være 0000-00-00

Det er en MySQLisme.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Martin (18-04-2005)
Kommentar
Fra : Martin


Dato : 18-04-05 02:10

Lars Sherman Christensen wrote:
> Martin wrote:
>
>> Hejsa...
>>
>> Jeg har et lille problem
>> jeg har 2 felter i min tabel start_dato og slut_dato
>> begge 2 af typen DATE - Datoen kan være en dato eller 0000-00-00
>
>
> Hej Martin
>
> Hvordan kan en dato være 0000-00-00. Jeg er ret sikker på, at når du
> definerer et felt med typen DATE, vil 0000-00-00 være invalid. Skulle du
> ikke overveje at bruge null, hvis det er en indikation af at datoen ikke
> er defineret?

Tjaa... 0000-00-00 virker helt fint i MySQL.
Hvorfor jeg bruger det er simpelthen fordi det skal være muligt at sætte
en ubestemt tid på en funktion.

Om jeg kunne bruge null istedet - det tror jeg faktisk ikk mysql kan
lide - har godt nok ikk prøvet det.

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408188
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste