Avatar billede sapworld Nybegynder
15. juli 2005 - 20:58 Der er 57 kommentarer og
1 løsning

Selektere først kommende dato i en access database

Hej

Jeg har en access database, og ville gerne vælge den først kommende fødselsdato.

Nogen der ved hvordan jeg gør det kan hjælpe. Det må være noget med:
<%

SQL = "select Top 1 * from adresser WHERE birthdate <= Date()"
set links = Conn.Execute(strSQL)
do while not links.eof%>
    - <a href="loadlink.asp?link=<%=links("link")%>"><%=links("text")%></a> <br>
<%  links.MoveNext
loop
%> 


/Kim
Avatar billede soes Nybegynder
15. juli 2005 - 21:02 #1
Ved ikke om man kan lave noget i stil med dette:
select * from adresser order by Datediff(d, date(), birthdate) asc
Avatar billede soes Nybegynder
15. juli 2005 - 21:06 #2
Wops. Mit forslag holder vist ikke helt vand.
Hvis metoden Datediff også ser på årstallet, vil det altid være den yngste person som står i database der vil blive vist først, så den holder nok ikke helt
Avatar billede sapworld Nybegynder
15. juli 2005 - 21:10 #3
Sådan?
<%
strSQL = "select * from adresser order by Datediff(d, date(), birthdate) asc"
set adresser = Conn.Execute(strSQL)
do while not adresser.eof
    Response.Write adresser("birthdate") & "<br>"
    adresser.MoveNext
loop
%>
Hvordan kan jeg nøjes med at få 1 record ud?
Avatar billede soes Nybegynder
15. juli 2005 - 21:14 #4
Det kan du gøre ved at lade være med at løbe dit recordset igennem :o)

<%
strSQL = "select * from adresser order by Datediff(d, date(), birthdate) asc"
set adresser = Conn.Execute(strSQL)
Response.Write adresser("birthdate") & "<br>"
%>

men som jeg skriver, jeg tror ikke min løsning er helt holdbar :o(

Ved ikke om det vil fungere med SELECT TOP 1 ... i access det er ved at være længe siden jeg har arbejdet med den
Avatar billede soes Nybegynder
15. juli 2005 - 21:15 #5
Men hvis det gør vil det hjælpe lidt på performance da recordsettet bliver mindre
Avatar billede nielle Nybegynder
15. juli 2005 - 21:17 #6
Måske sådan her:

SELECT TOP 1 *, DATEDIFF(d, birthdate, Date()) AS daysToNext FROM adresser ORDER BY daysToNext ASC
Avatar billede nielle Nybegynder
15. juli 2005 - 21:17 #7
Glemte lige det vigtigste:

SELECT TOP 1 *, (DATEDIFF(d, birthdate, Date()) MOD 365) AS daysToNext FROM adresser ORDER BY daysToNext ASC
Avatar billede sapworld Nybegynder
15. juli 2005 - 21:21 #8
Hvad med denne - kan den bruges i access?
Select Top 1 * From Tabel Where Dato > Date() Order By Dato
Avatar billede nielle Nybegynder
15. juli 2005 - 21:23 #9
MOD skal vist nok heller bruges på denne måde:

SELECT TOP 1 *, MOD(DATEDIFF(d, birthdate, Date()), 365) AS daysToNext FROM adresser ORDER BY daysToNext ASC
Avatar billede sapworld Nybegynder
15. juli 2005 - 21:47 #10
Jeg fik denne til at virke - er koden optimal?
<%
strSQL = "select Top 1 * from adresser WHERE birthdatenext > Date() order by birthdatenext"
set adresser = Conn.Execute(strSQL)
Response.Write adresser("birthdatenext") & "<br><br>" & adresser("fornavn") & " " & adresser("efternavn")
%>
Avatar billede nielle Nybegynder
15. juli 2005 - 21:52 #11
Hvordan får du beregnet birthdatenext?
Avatar billede sapworld Nybegynder
15. juli 2005 - 21:59 #12
Der har jeg en kolonne hvor alle dato'er er 2005 - kan din kode regne ud fra fødselsdato?
Avatar billede nielle Nybegynder
15. juli 2005 - 22:00 #13
Mener du koden i 15/07-2005 21:23:26? Så skulle svaret gerne være ja.
Avatar billede sapworld Nybegynder
15. juli 2005 - 22:01 #14
det ville være top - jeg får desværre denne fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'MOD(DATEDIFF(d, birthdate, Date()), 365)'.
Avatar billede nielle Nybegynder
15. juli 2005 - 22:08 #15
... for:

DATEDIFF(d, birthdate, Date())

- giver antallet af dage mellem selve fødslen og idag.

MOD( DATEDIFF(d, birthdate, Date()), 365 )

- justere denne sådan at antal hele år trækkes fra (vi glemmer alt om skudår).

Hmm... der er en fejl kan jeg se, for dette er jo dagene siden sidste fødselsdag (ikke til den næste):

MOD(DATEDIFF(d, birthdate, Date()), 365) AS daysFromLast

Men så skal vi bare sortere personerne efter hvem som er længst fra deres forrige fødselsdag:

SELECT * FROM adresser ORDER BY MOD(DATEDIFF(d, birthdate, Date()), 365) DESC

- og den første af disse:

SELECT TOP 1 * FROM adresser ORDER BY MOD(DATEDIFF(d, birthdate, Date()), 365) DESC
Avatar billede nielle Nybegynder
15. juli 2005 - 22:12 #16
Der er øjensynligt lidt forskellig syntaks mht. MOD og de forskellige databaser. Måske virker denne bedre:

SELECT TOP 1 *, (DATEDIFF(d, birthdate, Date()) MOD 365) AS daysFromLast FROM adresser ORDER BY daysFromLast DESC
Avatar billede sapworld Nybegynder
15. juli 2005 - 22:54 #17
Hmm - fejlen er anderledes:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
Avatar billede nielle Nybegynder
16. juli 2005 - 08:19 #18
SELECT TOP 1 *, DATEDIFF("d", birthdate, Date()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC

... dvs. i ASP:

SQL = "SELECT TOP 1 *, DATEDIFF(""d"", birthdate, Date()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 10:17 #19
Æv, jeg får stadig samme fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
Avatar billede nielle Nybegynder
16. juli 2005 - 10:19 #20
Prøv lige at poste noget mere af din kode.
Avatar billede sapworld Nybegynder
16. juli 2005 - 10:20 #21
<%
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../DB/database.mdb")
Conn.Open DSN
%>
<%
strSQL = "SELECT TOP 1 *, DATEDIFF(""d"", birthdate, Date()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
set adresser = Conn.Execute(strSQL)
Response.Write adresser("birthdate") & "<br>" & adresser("fornavn")
%>
Avatar billede nielle Nybegynder
16. juli 2005 - 10:24 #22
Får du noget linjenummer på hvor den brokker sig?
Avatar billede sapworld Nybegynder
16. juli 2005 - 10:33 #23
Linie 70:
set adresser = Conn.Execute(strSQL)
Avatar billede nielle Nybegynder
16. juli 2005 - 11:00 #24
Måske:

strSQL = "SELECT TOP 1 *, DATEDIFF(""d"", birthdate, GetDate()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"

... og ellers er jeg ved at være totalt blank på hvad der er galt. :^|
Avatar billede sapworld Nybegynder
16. juli 2005 - 11:44 #25
Hmm - stadig samme fejl. Nå, men de har virkelig gjort hvad du kunne for at hjælpe. Poster du et svar?
Avatar billede nielle Nybegynder
16. juli 2005 - 13:14 #26
Jeg er ikke helt parat til at give op. Prøv eventuelt disse forenklinger en efter en og se hvornår det gør godt (i den forstand at der i det mindste ikke er nogen fejl mere):

Original:

strSQL = "SELECT TOP 1 *, DATEDIFF(""d"", birthdate, GetDate()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"

Uden MOD:

strSQL = "SELECT TOP 1 *, DATEDIFF(""d"", birthdate, GetDate()) AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"

Med en hardcodet dato i stedet for GetDate():

strSQL = "SELECT TOP 1 *, DATEDIFF(""d"", birthdate, #2005-07-16#) AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"

Uden DateDiff.

strSQL = "SELECT TOP 1 *, birthdate AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 13:34 #27
Du er ihærdig :)
Original:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Undefined function 'GetDate' in expression.


Uden MOD:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Undefined function 'GetDate' in expression.


Med en hardcodet dato i stedet for GetDate():

Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.


Uden DateDiff.

Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
Avatar billede nielle Nybegynder
16. juli 2005 - 16:07 #28
Selvfølgelig, vi skal jo have løst problemet. :^)

Der er et eller andet helt galt hvis ikke engang den sidste virker. Nu kan det bæsten ikke blive simplere:

SELECT TOP 1 FROM adresser ORDER BY birthdate DESC
Avatar billede sapworld Nybegynder
16. juli 2005 - 18:13 #29
Den er god nok - hvis jeg sætter et * ind:
strSQL = "SELECT TOP 1 * FROM adresser ORDER BY birthdate DESC"

Så får jeg en med fødselsdag 26-07-2005
Avatar billede nielle Nybegynder
16. juli 2005 - 18:16 #30
Hvad så med:

strSQL = "SELECT TOP 1 birthdate, DATEDIFF(""d"", birthdate, GetDate()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 18:48 #31
Hmm - denne fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Undefined function 'GetDate' in expression.
Avatar billede nielle Nybegynder
16. juli 2005 - 20:48 #32
Date i stedet for GetDate:

strSQL = "SELECT TOP 1 birthdate, DATEDIFF(""d"", birthdate, Date()) MOD 365 AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 21:21 #33
Så får jeg fejlen:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
Avatar billede nielle Nybegynder
16. juli 2005 - 21:25 #34
Også uden MOD?

strSQL = "SELECT TOP 1 birthdate, DATEDIFF(""d"", birthdate, Date()) AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 21:37 #35
Yep
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
Avatar billede nielle Nybegynder
16. juli 2005 - 21:41 #36
... og ved en hardkodet dato?

strSQL = "SELECT TOP 1 birthdate, DATEDIFF(""d"", birthdate, #2005-07-16#) AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 21:57 #37
Samme fejl
Avatar billede nielle Nybegynder
16. juli 2005 - 21:59 #38
Bizart...

strSQL = "SELECT birthdate, DATEDIFF('d', birthdate, #2005-07-16#) FROM adresser"
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:03 #39
Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede nielle Nybegynder
16. juli 2005 - 22:05 #40
Det lyder som om at du ikke har nogen søjle som hedder birthdate?
Avatar billede nielle Nybegynder
16. juli 2005 - 22:08 #41
Nej vent, det er nok lidt længere nede i din kode at den brokkers sig...

strSQL = "SELECT birthdate, DATEDIFF('d', birthdate, #2005-07-16#) AS daysFromLast FROM adresser"
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:12 #42
Jeg får denne fejl:
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede nielle Nybegynder
16. juli 2005 - 22:13 #43
Det er nok denne her:

Response.Write adresser("birthdate") & "<br>" & adresser("fornavn")

Vi trækker jo ikke "fornavn" ud af databasen. Skulle gerne forsvinde med:

strSQL = "SELECT birthdate, fornavn, DATEDIFF('d', birthdate, #2005-07-16#) AS daysFromLast FROM adresser"
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:23 #44
yes Yes :) - Så kom der en værdi frem, selvom det ikke er den rigtige. Valgte en den 12-11-1969, men den skulle tage en den 26-07-1969
Avatar billede nielle Nybegynder
16. juli 2005 - 22:24 #45
Klar, der er jo heller ikke nogen sortering på lige nu:

strSQL = "SELECT birthdate, fornavn, DATEDIFF('d', birthdate, #2005-07-16#) AS daysFromLast FROM adresser ORDER BY daysFromLast"
Avatar billede nielle Nybegynder
16. juli 2005 - 22:25 #46
strSQL = "SELECT birthdate, fornavn, DATEDIFF('d', birthdate, #2005-07-16#) AS daysFromLast FROM adresser ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:28 #47
Den kan den ikke lide:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
Avatar billede nielle Nybegynder
16. juli 2005 - 22:30 #48
Så tager vi da en lidt alternativ rute:

strSQL = "SELECT * FROM (SELECT birthdate, fornavn, DATEDIFF('d', birthdate, #2005-07-16#) AS daysFromLast FROM adresser) ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:36 #49
Der var bid, men det var den ælste i databasen der blev valgt
Avatar billede nielle Nybegynder
16. juli 2005 - 22:37 #50
... og så er jeg lige ved at tro at vi måske er i mål med:

strSQL = "SELECT * FROM (SELECT birthdate, fornavn, DATEDIFF('d', birthdate, Date()) MOD 365 AS daysFromLast FROM adresser) ORDER BY daysFromLast DESC"
Avatar billede nielle Nybegynder
16. juli 2005 - 22:38 #51
... altså med TOP på.

strSQL = "SELECT TOP 1 * FROM (SELECT birthdate, fornavn, DATEDIFF('d', birthdate, Date()) MOD 365 AS daysFromLast FROM adresser) ORDER BY daysFromLast DESC"
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:39 #52
yep yep yep :D
Avatar billede nielle Nybegynder
16. juli 2005 - 22:40 #53
STOOOOOOORT glad smil herfra.
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:42 #54
Endnu større herfra - fedt du gad tage dig tiden til at hjælpe. Kan jeg forhøje pointene inden jeg lukker?
Avatar billede nielle Nybegynder
16. juli 2005 - 22:43 #55
Svar :^)
Avatar billede nielle Nybegynder
16. juli 2005 - 22:44 #56
Du behøver nu ikke at give flere point. :^)

... men her er metoden:

http://expfaq.1go.dk/?id=33#flere_point_end_lovet
Avatar billede sapworld Nybegynder
16. juli 2005 - 22:50 #57
Det har været en stor hjælp - tak endnu engang :D
Avatar billede nielle Nybegynder
16. juli 2005 - 23:08 #58
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester