webForumDet fria alternativet

Datum närmast dagensdatum och tid

7 svar · 513 visningar · startad av Addeladde

AddeladdeMedlem sedan jan. 20013 406 inlägg
#1

Hej

Jag vill få fram den post i databasen där ett datum ligger närmast dagens datum. I första hand ska den öppna datum som kommer men finns inget sådant så ska den öppna ett tidigare datum.

ex.

 Select top 1 datum from kalender where datum ........
LarsGMedlem sedan dec. 200012 464 inlägg
#2
select min(datum)
 from kalender
 where datum > date() -- getdate() etc beroende på dbms
union all
 select max(datum)
    from kalender
  where datum < date()
   and not exists
  (select * 
      from kalender
     where datum > date())
AddeladdeMedlem sedan jan. 20013 406 inlägg
#3

Försöker få till det men lyckas inte så bra. Det är lite fler tabeller.
Anvandare, lektioner och kursmedlemskap.
Det jag vill åstadkomma är att öppna upp den den lektion med närmast datum helst fram i tiden. Lektionen ska sedan tillhöra en kurs som användaren är kopplad till.
Databasen är access.

SELECT min(l.lektionDatum), k.kursID 
FROM kurser as k, kursmedlemskap as km, lektioner 
WHERE km.anvandarID= 1 
And km.kursID = k.kursID 
And k.kursID = l.kursID 
And l.lektiondatum > date() 
union all 
select max(lektiondatum) 
from lektioner where lektiondatum < date() 
and not exists (select * from lektioner where lektiondatum > date())

Antalet kolumner i tabellerna eller frågorna i unionsfrågan stämmer inte överens.

@ndersMedlem sedan juni 200032 969 inlägg
#4

Felmeddelandet är väl ganska tydligt?

I den första select-frågan hämtar du två fält / värden, och i den andra bara ett.

AddeladdeMedlem sedan jan. 20013 406 inlägg
#5

Tror jag fattat lite mer hur det funkar men behöver nog lite förklaringar.
Först och främst den sista delen i koden "if not exists" hämtar inte den sql-satsen alla lektioner där datumet är mindre. Behöver bara få kursID på den kurs som har en lektion närmast.

Nu har jag koden

Select min(l.lektionDatum), k.kursID 
From kurser as k, kursmedlemskap as km, lektioner as l 
Where km.anvandarID= 1 
And km.kursID = k.kursID 
And k.kursID = l.kursID 
And l.lektiondatum > date() 
union all 
Select max(l.lektionDatum), k.kursID 
From kurser as k, kursmedlemskap as km, lektioner as l 
Where km.anvandarID= 1 
And km.kursID = k.kursID 
And k.kursID = l.kursID 
And l.lektiondatum < date() 
And not exists (Select l.lektionDatum, k.kursID 
From kurser as k, kursmedlemskap as km, lektioner as l 
Where km.anvandarID= 1 
And km.kursID = k.kursID 
And k.kursID = l.kursID 
And l.lektiondatum > date())

Nu får jag felmeddelandet:

Du försökte köra en fråga med en mängdfunktion som inte innehöll det angivna uttrycket 'kursID'.

AddeladdeMedlem sedan jan. 20013 406 inlägg
#6

Ingen?

AddeladdeMedlem sedan jan. 20013 406 inlägg
#7

Tog bort min() och använde top 1 och order by istället.

sqlString = "Select top 1 l.lektionDatum, l.kursID " &_
"From kursmedlemskap as km, lektioner as l " &_
"Where km.kursID = l.kursID " &_
"And km.anvandarID = 1 " &_
"And l.lektionDatum > #"& now &"# " &_
"Order By l.lektionDatum Desc " &_
"Union All " &_
"Select top 1 l.lektionDatum, l.kursID " &_
"From kursmedlemskap as km, lektioner as l " &_
"Where km.kursID = l.kursID " &_
"And km.anvandarID = 1 " &_
"And l.lektionDatum < #"& now &"# " &_
"And not exists (Select l.lektionDatum from kursmedlemskap as km, lektioner as l Where km.anvandarID = 1 And km.kursID = l.kursID And l.lektiondatum > #"& now &"#) " &_
"Order By l.lektionDatum ASC "

Blir det någon skillnad?

AddeladdeMedlem sedan jan. 20013 406 inlägg
#8

Då verkar det bli problem när man har desc i ena frågan och asc i den andra frågan.

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)