/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
asp & MySql henter nyeste og ældste nyhed ~
Fra : pope


Dato : 10-09-04 09:48

Hej NG,

Jeg har en SQL sætning som jeg har stirret mig blind på, det er
meningen, at den skal hente de nyheder ud af databasen, som ikke
har overskredet udløbsdatoen, men den tager den nyest og den
ældste ud.. kan i se hvad problemet er?:

her er variablen som inden holder dagens dato:

strDate = date()

---

Og her er den SQL sætning, som jeg tror skaber problemet:

strSQL = "SELECT * FROM nyhedsmodul WHERE TO_DAYS(now()) -
TO_DAYS(udloebsdato) <= " & strDate & " Order By oprettet Desc"

---

På forhånd tak for hjælpen

Mvh

Dennis

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jens Gyldenkærne Cla~ (10-09-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 10-09-04 22:46

pope skrev:

> her er variablen som inden holder dagens dato:
>
> strDate = date()

Første problem - undgå så vidt muligt at bruge
tekstrepræsentationer af datoer. Når du lader asp generere en dato
og derefter lægger den over i en sql-sætning, er det en tekstlig
repræsentation af datoen - med dertil hørende mulighed for
fejlfortolkning.

Alle moderne databaser har en funktion der giver dags dato + tid
(Now() i Access, GETDATE() i MSSQL - jeg kender desværre ikke
funktionsnavnet i MySQL). Brug databasens funktion, så har du en
fejlkilde mindre.


> strSQL = "SELECT * FROM nyhedsmodul WHERE TO_DAYS(now()) -
> TO_DAYS(udloebsdato) <= " & strDate & " Order By oprettet Desc"

Jeg er ikke MySQL-mand, men hvad er formålet med venstre side af
sammenligningen (TO_DAYS(now()) - TO_DAYS(udloebsdato)) ?

For at finde nyheder hvor udløbsdatoen ikke er overskredet er det
nok at sammenligne feltet udloebsdato med dags dato. I MSSQL ville
det se sådan ud:

SELECT * FROM nyhedsmodul WHERE udloebsdato <= GETDATE()

I MySQL kan man garanteret noget tilsvarende - du skal bare kende
mysql-udgaven af Now/Getdate.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

pope (13-09-2004)
Kommentar
Fra : pope


Dato : 13-09-04 07:57

> Alle moderne databaser har en funktion der giver dags dato + tid
> (Now() i Access, GETDATE() i MSSQL - jeg kender desværre ikke
> funktionsnavnet i MySQL). Brug databasens funktion, så har du en
> fejlkilde mindre.

jeg fandt ud af inde på mysql.com at mysql dato fuction er den samme
som i access "NOW()" mit problem, var bare at en NOW() i mysql
skrives omvendt f.eks 2004-12-31 hvor i access skrives den ud som
f.eks 31-12-2004, og da jeg skrev min udløbsdato i en asp fil med en
almindelig now() function, som bruger kunne ændre, men jeg fandt ud
af, hvis jeg vendte min dato om i asp filen, og brugte din sql
sætning, virker det perfekt!

> Jeg er ikke MySQL-mand, men hvad er formålet med venstre side af
> sammenligningen (TO_DAYS(now()) - TO_DAYS(udloebsdato)) ?

Øh... ja altså jeg prøvede på at vende min asp dato om i sql
sætningen, og inde mysql.com havde jeg set, at man evt. kunne gøre
det på den måde, men det virkede ikke optimalt, da den skrev den
nyste og den ældste nyhed ud, og glemte alt om de andre


> SELECT * FROM nyhedsmodul WHERE udloebsdato <= GETDATE()
Endte med at se sådan her ud:
strSQL = "SELECT * FROM nyhedsmodul WHERE udloebsdato >= now()"


Mange tak for hjælpen, du har været til stor hjælp, lige til at give
et puf i den rigtige retning

Mvh

Dennis

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jens Gyldenkærne Cla~ (13-09-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-09-04 10:19

pope skrev:

> jeg fandt ud af inde på mysql.com at mysql dato fuction er den samme
> som i access "NOW()"

O.k.


> mit problem, var bare at en NOW() i mysql skrives omvendt f.eks
> 2004-12-31 hvor i access skrives den ud som f.eks 31-12-2004,

Sålænge du arbejder med datoværdier og ikke datorepræsentationer, er det
fuldstændigt ligegyldigt hvordan databasen vælger at prænsentere en dato
for dig.

> og da jeg skrev min udløbsdato i en asp fil med en almindelig now()
> function, som bruger kunne ændre, men jeg fandt ud af, hvis jeg
> vendte min dato om i asp filen, og brugte din sql sætning, virker det
> perfekt!

Bruger du en datotype til datoen i mysql? Hvis du gør det - og i øvrigt
sørger for at bruge datofunktioner fra databasen når du skal skrive og
sammenligne datoværdier, så er der ingen problemer.

Løsningen med at "vende" datoen i asp lyder meget ustabil. Er du sikker
på at den virker for alle datoer?

Prøv at se forskellen på de to sætninger her:

strSQL = "INSERT INTO tabel (datofelt) VALUES ('" & Now() & "')"

strSQL = "INSERT INTO tabel (datofelt) VALUES (Now())"

Den første bruger asp-funktionen Now til at generere en dato. Den bliver
så oversat til en tekstværdi og sendt som en del af sql-sætningen til
databasen. Nu er det op til databasen at afgøre hvordan datoen skal
fortolkes - og her kan man let risikere at databasen tænker i mm-dd-yyyy
mens asp-parseren tænker i dd-mm-yyyy.

I den anden funktion eksisterer det problem ikke. Databasen modtager
blot et kald til sin egen funktion Now - og beregner dags dato så den
bliver indsat korrekt. Som bruger kan man være fuldstændig ligeglad med
om databasen arbejder med dd-mm-yyyy eller mm-dd-yyyy - datoen skal nok
komme rigtigt ind.


> Øh... ja altså jeg prøvede på at vende min asp dato om i sql
> sætningen, og inde mysql.com havde jeg set, at man evt. kunne gøre
> det på den måde,

Det lyder stadig som en dårlig plan.


> strSQL = "SELECT * FROM nyhedsmodul WHERE udloebsdato >= now()"

Det ser til gengæld godt ud. Dog skal du være opmærksom på om
grænsetilfælde også håndteres korrekt. Hvis udloebsdato er sat uden et
tidspunkt vil det af nogle databaser blive opfattet som kl. 00 den dag -
og da sammenligningen med now() også medtager tidspunktet, vil der i
praksis ikke være forskel på udloebsdato >= now() og udloebsdato > now()
- med andre ord, hvis der er angivet udløbsdato d. 13. september 2004,
vil nyheden blive vist til og med 12. september 2004.

Man kan vælge at tilpasse sql-koden så der bliver sammenlignet uden
timeantal, eller bare acceptere at den udløbsdato man sætter i tabellen
altså er den første dato en post _ikke_ skal vises.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste