Avatar billede zuiq Nybegynder
19. september 2003 - 12:49 Der er 36 kommentarer og
2 løsninger

'Levetid' på annonce. (ASP/SQL)

Hej
Jeg er igang med at lave sådan et annonce system, og ska lige bruge lidt hjælp.
Okey, jeg vil gerne ha sådan at man kan vælge hvor lang tid ens annonce skal være 'aktiv' fra den dag man opretter´. 7, 15 eller 30 dage.

Lige nu bruger jeg en If sætning i min While løkke:
If DateDiff("d", objRS("date"), date) <= objRS("auktion_life") Then

Men det holder jo ikke, fordi hvis jeg definere i SQL-strengen at jeg gerne vil ha fx. 10 poster vist. Så kører min while løkke igennem 10 gange, og hvis der så er en post der er for gammel så springer while løkken bare den post over. Dvs. at der så i dét tilfælde kun ville blive vist 9 poster :)

Jeg har prøvet at gøre det i SQL streng på følgende måde:
.. WHERE " & DateDiff("d", objRS("date"), date) & " <= auk_data.auktion_life ..

Men det virker ikke, får følgende fejl:
ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/auktion/pages/show.asp, line 7

Har en mistanke om at det er fordi jeg prøver at hente objRS("date") 'inde i' selve SQL strengen..

Hvordan gør jeg det i SQLstrengen?

Mvh.
Mads
Avatar billede eagleeye Praktikant
19. september 2003 - 12:53 #1
hvilken database er der tale om?
Avatar billede netro Nybegynder
19. september 2003 - 12:54 #2
Select Noget From Tabel Where DateAdd(d, Periode, Datofelt) >= Now()

(Afhængig af database)
Avatar billede eagleeye Praktikant
19. september 2003 - 12:54 #3
Hvis der er Access så prøv med dette:

.. WHERE DateDiff('d', [date], date()) <= auk_data.auktion_life"
Avatar billede zuiq Nybegynder
19. september 2003 - 12:58 #4
Det er en MySQL database.
Avatar billede eagleeye Praktikant
19. september 2003 - 13:03 #5
hvilker version?? men prøv med:


SQL = "... WHERE DATE_ADD(date, INTERVAL auktion_life DAY) >= CURDATE()"
Avatar billede eagleeye Praktikant
19. september 2003 - 13:05 #6
der skal måske nok [] omkring kolonnennavnet date: [date]
Avatar billede zuiq Nybegynder
19. september 2003 - 13:06 #7
okey... forklar mig lige hvad hver enkelt del gør :).. og om jeg skal sætte noget andet op hvis jeg bruger den der..

Forresten så er objRS("auktion_life") den tid som annoncen skal være aktiv.
Og objRS("date") er den dato annoncen blev oprettet.
Avatar billede zuiq Nybegynder
19. september 2003 - 13:07 #8
er det meningen at du har lavet <= om til >= ?
Avatar billede eagleeye Praktikant
19. september 2003 - 13:11 #9
Du skal lave en SQL som kun henter de ting som skal vise, s¨å du ikke behøver en if sætning inde i din while loop. Ja det er bevidt da den ene er med DateDiff og den anden med DATE_ADD:

Så din kode bliver til:

SQL = "SELECT * FROM tabel WHERE DATE_ADD(date, INTERVAL auktion_life DAY) >= CURDATE()"
set objRS = Conn.Execute(SQL)

do while not objRS.EOF
  'kode som udksriver annonce

  objRS.Movenext
loop
Avatar billede eagleeye Praktikant
19. september 2003 - 13:12 #10
forklaring:
DATE_ADD(date, INTERVAL auktion_life DAY)
Den ligger antallet af dage som annoncen skal vise til den dato annoncen er oprette og tjekke hvis den dato er >= idag så vises annoncen, den udregner faktsik slut datoen for annoncen skal vises.
Avatar billede netro Nybegynder
19. september 2003 - 13:12 #11
Der lægges X dage til oprettelsesdatoen og tjekkes for, om datoen i dag er mindre end eller lig med denne.

Du kan også bruge Date_Sub og udskifte enhedstypen DAY:

SECOND
MINUTE
HOUR
MONTH
YEAR
MINUTE_SECOND
HOUR_MINUTE
DAY_HOUR
YEARS_MONTH
Avatar billede eagleeye Praktikant
19. september 2003 - 13:13 #12
Du kan tage et kig på www.mysql.com direkte link til deres dato funktioner:
http://www.mysql.com/doc/en/Date_and_time_functions.html
Avatar billede zuiq Nybegynder
19. september 2003 - 13:24 #13
Tror du har lavet noget forkert.
Her er hvad den burde/skal gøre:
Den skal finde ud af foreskellen i dage imellem objRS("date") og datoen for idag. Derefter skal den så sige "Hvis foreskellen imellem de to datoer er lig med eller mindre end objRS("auktion_life") så skal dén post med."

Mvh.
Mads
Avatar billede netro Nybegynder
19. september 2003 - 13:28 #14
Resultatet bliver det samme, uanset hvordan du gør det.
Avatar billede eagleeye Praktikant
19. september 2003 - 13:30 #15
Jeg tror ikke du forstår hvad jeg har skrevet.

Det er jo nøjaktig det samme bare udregnet på en anden måde... Den finder slut datoen for hvornår annoncen skal vise og tjekke om den er nyere end dags dato og hvis den er det medtages kolonne, du skal glemme det med objRS("date") og - dags dato for når du laver den første SQL er der ikke noget recordset mend datoer i.
Avatar billede eagleeye Praktikant
19. september 2003 - 13:33 #16
du har sikker noget i som dete:

SQL = SELECT * FROM tabel"
set objrs = conn.execute(SQL)
do while not objrs.EOF
  If DateDiff("d", objRS("date"), date) <= objRS("auktion_life") Then
    vis den
  end if

  objRs.Movenext
loop

og det skal laves om som vist 19/09-2003 13:11:08 du lader mySQL udregne og bestemme hvilke der skal vises i stedet for at hendte alt og så bruge if sætningnen til at bestemme en post udskrives eller ej.
Avatar billede zuiq Nybegynder
19. september 2003 - 13:38 #17
ja det forstår jeg godt, og jeg har indsat det SQL du har givet mig.. det virker åbenbart bare ik :)

Tror måske den MySQL server jeg kører på har forkert dato, fordi når jeg sætter auktion_life til 7 så "forsvinder" posten først når jeg har sat oprettelses datoen til 03-09/03 .. Mærkeligt..
Avatar billede netro Nybegynder
19. september 2003 - 13:40 #18
Det kan du hurtigt finde ud af:

Set rs = "Select Now() As Nu"
Response.Write rs("Nu")
Avatar billede netro Nybegynder
19. september 2003 - 13:42 #19
03-09/03 ? Du bruger vel ikke dansk datoformat?
Avatar billede zuiq Nybegynder
19. september 2003 - 13:44 #20
Hmm, den viser:
2003-09-19 13:43:44

Så dét burde være iorden.. hva ka fejlen så være?
Avatar billede zuiq Nybegynder
19. september 2003 - 13:44 #21
nej bruger:
03-09-03
Avatar billede zuiq Nybegynder
19. september 2003 - 13:44 #22
men LCID ER sat til 1030
Avatar billede netro Nybegynder
19. september 2003 - 13:46 #23
Hvordan indsætter du dine datoer i tabellen?
Avatar billede zuiq Nybegynder
19. september 2003 - 13:47 #24
datoen bliver hentet igennem ASP's dato. (fx. response.write dato)
Avatar billede zuiq Nybegynder
19. september 2003 - 13:48 #25
og så sat ind i en SQLstreng der tilføjer den til database
Avatar billede netro Nybegynder
19. september 2003 - 13:48 #26
Du skal også huske at indsætte i formatet YYYY-MM-DD. Det er formentlig der, den går galt.
Avatar billede zuiq Nybegynder
19. september 2003 - 13:49 #27
hvordan indsætter jeg den på dén måde?
Avatar billede netro Nybegynder
19. september 2003 - 13:49 #28
Når der oprettes en annonce, så brug blot Now() i MySQL ved indsættelsen:

Insert Into Tabel(Datofelt) Values(Now())
Avatar billede zuiq Nybegynder
19. september 2003 - 13:50 #29
nej ikke now, ska jo kun bruge datoen..
Avatar billede netro Nybegynder
19. september 2003 - 13:50 #30
- så er du sikker på, datoen bliver lagt rigtig i tabellen.
Avatar billede zuiq Nybegynder
19. september 2003 - 13:50 #31
tiden bliver gemt i et andet felt
Avatar billede netro Nybegynder
19. september 2003 - 13:51 #32
Hvis det bare er et felt af typen Date (og ikke DateTime), udelades klokkeslættet automatisk, selvom du indsætter Now().
Avatar billede netro Nybegynder
19. september 2003 - 13:54 #33
Dvs. 2003-09-19 13:51:31 bliver i et felt af typen DATE til:

2003-09-19

I feltet med tiden kan du bruge CURTIME() i stedet
Avatar billede zuiq Nybegynder
19. september 2003 - 14:04 #34
nice, nu virker det.
Avatar billede zuiq Nybegynder
19. september 2003 - 14:04 #35
lav lige et svar begge to..
Avatar billede eagleeye Praktikant
19. september 2003 - 14:05 #36
Ok ;)
ja der vikede lidt mystisk hvis typen var date og dermed skulle formatet være ok.. Skulle du rette now() til curdate() ?
Avatar billede netro Nybegynder
19. september 2003 - 14:07 #37
Det er godt :)
Avatar billede zuiq Nybegynder
19. september 2003 - 14:17 #38
nej now() virkede fint
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