webForumDet fria alternativet

Datum närmast dagensdatum och tid

Databaser & SQL

7 svar · 513 visningar · startad av Addeladde

Medlem sedan jan. 20013 406 inlägg
Frågan#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 ........
Medlem 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())
Medlem 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.

Medlem sedan juni 200032 967 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.

Medlem 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'.

Medlem sedan jan. 20013 406 inlägg
#6

Ingen?

Medlem 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?

Medlem 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.

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)