[SQL] of niks of iets na bepaalde datum

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Hoi,

Het volgende wil ik doen:
Er is een kolom met een aantal datums. Als de datum na de sysdate ligt moet ie wel weergegeven worden, anders moet niks weergegeven worden.

Weten jullie hiervoor een simpele manier (dus zonder extra views ed)

BvD

  • Onno
  • Registratie: Juni 1999
  • Niet online
select * from tabel where datum>sysdate()

:?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Volgens mij bedoel je zoiets als

SELECT if(tabel.datekolom<sysdate;"";tabel.datekolom)
FROM tabel;

Zonder dat je het dialect van je SQL geeft kan je het niet meer precies zeggen. Ik ken Oracle goed, dus ....
Ik kan een erg gore oplossing bedenken die altijd werkt:
(zo goor dat je 'm niet moet gebruiken!!)

[BEGIN VAN DE TRANSACTIE]
update tabel
set datekolom = null
where datekolom < sysdate;

SELECT ....

rollback;
[EIND TRANSACTIE

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op maandag 10 december 2001 13:43 schreef Goodielover het volgende:
Ik kan een erg gore oplossing bedenken die altijd werkt:
Niet altijd.. er bestaan nog databases (*kuch*) die het zonder transactions moeten stellen. :)

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Op maandag 10 december 2001 13:35 schreef Onno het volgende:
select * from tabel where datum>sysdate()

:?
Bedoel niet dat er dan helemaal niks wordt weergegeven :) maar dat er dan in die kolom niks verschijnt...

  • Onno
  • Registratie: Juni 1999
  • Niet online
Dan moet je een constructie gebruiken zoals Goodielover noemt, maar hoe die er precies uitziet hangt af van welke database je gebruikt. Dus.. welke is dat? :)

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Op maandag 10 december 2001 13:56 schreef Onno het volgende:
Dan moet je een constructie gebruiken zoals Goodielover noemt, maar hoe die er precies uitziet hangt af van welke database je gebruikt. Dus.. welke is dat? :)
Oracle 7.3.4.4 .. soon 8.1.7.0.0 .....

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op maandag 10 december 2001 13:58 schreef Dash2in1 het volgende:

[..]

Oracle 7.3.4.4 .. soon 8.1.7.0.0 .....
code:
1
2
3
4
5
6
7
select veld1, veld2, veld3, datumveld
from tabel
where datumveld>sysdate
union all
select veld1, veld2, veld3, null
from tabel
where datumveld<=sysdate

Who is John Galt?


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Op maandag 10 december 2001 14:01 schreef justmental het volgende:

[..]
code:
1
2
3
4
5
6
7
select veld1, veld2, veld3, datumveld
from tabel
where datumveld>sysdate
union all
select veld1, veld2, veld3, null
from tabel
where datumveld<=sysdate
Op zich werkt deze optie. Echter de query is al bijzonder groot, en met een union wordt deze dus ongeveer 2 keer zo groot in totaal .. heb je misschien nog een andere optie? (Nee, niet die rollback van boven >:) )

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op maandag 10 december 2001 14:25 schreef Dash2in1 het volgende:

[..]

Op zich werkt deze optie. Echter de query is al bijzonder groot, en met een union wordt deze dus ongeveer 2 keer zo groot in totaal .. heb je misschien nog een andere optie? (Nee, niet die rollback van boven >:) )
Wat is er tegen een grote query?
Normaal gesproken zou je zoiets ook met een decode kunnen doen, maar in dit geval gaat dat waarschijnlijk niet werken.
code:
1
2
select decode(datumveld>sysdate, true, datumveld, null)
from tabel

Maar ik geloof niet dat deze constructie (evaluatie binnen decode) toegestaan is.

Who is John Galt?


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Op maandag 10 december 2001 14:58 schreef justmental het volgende:

[..]

Wat is er tegen een grote query?
Normaal gesproken zou je zoiets ook met een decode kunnen doen, maar in dit geval gaat dat waarschijnlijk niet werken.
code:
1
2
select decode(datumveld>sysdate, true, datumveld, null)
from tabel

Maar ik geloof niet dat deze constructie (evaluatie binnen decode) toegestaan is.
Omdat de query dan redelijk tot zeer onleesbaar wordt ... Wat natuurlijk wel mogelijk is, maar wat minder wenselijk met het oog op de toekomst...
Maar goed, het is wel een goede optie die je gegeven hebt, ga dat dan maar gebruiken, bedankt ervoor :)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

De decode werkt niet op deze manier.
Decode is een soort CASE statement.

Je kan het volgende wel gebruiken.

select decode(sign(datumkolom-trunc(sysdate)),1,datumkolom,null)
from tabel;

Het kan zijn dat je nog een conversie naar integer om de datumkolom-trunc(sysdate) moet zetten voor je een sign van de datum kunt nemen. Misschien dat een Months_between ook werkt als conversie naar int

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op maandag 10 december 2001 15:18 schreef Dash2in1 het volgende:
Omdat de query dan redelijk tot zeer onleesbaar wordt ... Wat natuurlijk wel mogelijk is, maar wat minder wenselijk met het oog op de toekomst...
Maar goed, het is wel een goede optie die je gegeven hebt, ga dat dan maar gebruiken, bedankt ervoor :)
Nog een alternatief is pl/sql gebruiken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare
  cursor c_datum is
  select datumveld
  from tabel;
begin
  for r_datum in c_datum
  loop
    if r_datum.datumveld>sysdate
    then
    dbms_output.put_line (to_char(datumveld,'dd-mm-yyyy hh24:mi:ss');
    else
    dbms_output.put_line (' ');
    end if;
  end loop;
end;
/

Who is John Galt?


  • FastWallie
  • Registratie: September 2001
  • Laatst online: 25-11-2024
Aangezien SQL rijeen ophaald ben je verplicht per selectie evenveel kolommen op te halen als de vorige rij.

die optie met de decode lijkt me de mooiste, eenvoudigste, snelste.
Er is geen union of where nodig want je wilt wel de rij met daarin de verdere gegevens maar niet het datumveld. Toch ???

http://www.jawal.nl


  • FastWallie
  • Registratie: September 2001
  • Laatst online: 25-11-2024
Echter,

je moet de deocde dan wel goed gebruiken, bv:

select decode(datum - sysdate, 0, 'Hetzelfde', 'Niet Vandaag') from Dual

http://www.jawal.nl


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Op maandag 10 december 2001 16:40 schreef FastWallie het volgende:
Aangezien SQL rijeen ophaald ben je verplicht per selectie evenveel kolommen op te halen als de vorige rij.

die optie met de decode lijkt me de mooiste, eenvoudigste, snelste.
Er is geen union of where nodig want je wilt wel de rij met daarin de verdere gegevens maar niet het datumveld. Toch ???
Heb dezelfde mening, mijn dank voor die decode aan goodielover .. en natuurlijk de anderen voor het meedenken :)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op maandag 10 december 2001 16:49 schreef Dash2in1 het volgende:

[..]

Heb dezelfde mening, mijn dank voor die decode aan goodielover .. en natuurlijk de anderen voor het meedenken :)
Graag gedaan en aan FastWallie: Wat is fout aan mijn decode

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op maandag 10 december 2001 16:56 schreef Goodielover het volgende:

[..]

Graag gedaan en aan FastWallie: Wat is fout aan mijn decode
Weinig.
Die van jou was een stuk beter dan die van wallie ;)

Who is John Galt?

Pagina: 1