/ 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
Antal dage i en måned
Fra : Ukendt


Dato : 24-10-06 09:40

Hej,
Fra en Access DB viser jeg en liste over de foregående 3 måneders poster med
nedenstående kode:
<%
Function DateToSql(Value)
DateToSql = "DateSerial(" & Year(Value) & ", " & _
Month(Value) & ", " & _
Day(Value) & ")"
End Function

Function DateFromSql(Value)
DateFromSql = "DateSerial(" & Year(Value) & ", " & _
Month(Value)-3 & ", " & _
Day(Value) & ")"
End Function

Mydate = left(now,10)
SQLstmt = "SELECT IncidentNo FROM tblIncidentLog WHERE IncidentDate BETWEEN
(" & DateFromSql(MyDate) & ") AND (" & DateToSql(MyDate) & ")"
%>

Når jeg trækker 3 fra måneds værdien i 'DateSerial' vil jeg kunne få datoen
31 februar og 31 dage i måneder med 30 dage, vil det give problemer ved DB
opslag?
Er der en anden måde at få en dato 3 måneder fra dags dato med korrekt antal
dage i måneden?

M.v.h.
Henning



 
 
Jens Gyldenkærne Cla~ (24-10-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 24-10-06 11:11

Henning Smed skrev:

> Fra en Access DB viser jeg en liste over de foregående 3
> måneders poster med nedenstående kode:

[snip]


> Mydate = left(now,10)

Tillykke - du har ramt én af mine kæpheste

Når det gælder datoer bør man altid - *altid* - prøve at holde sig
til databasens datofunktioner. Det sparer dig for en masse
potentielle konverteringsfejl.

Hvis man skal arbejde med en dato der skal beregnes i forhold til
den aktuelle dato (altså fx "nu", "om 5 timer", "for 1 måned
siden"), skal man *ikke* bruge asp/vbscript til at finde datoen -
har man en linje som ovenstående er det et sikkert tegn på at man
er på afveje.

Enhver database har selv funktioner til at håndtere datoer - incl.
en funktion til at generere dags dato (med og uden tid). I Access
er det meget simpelt, da funktionerne er præcis de samme som i asp.

En forespørgsel der udvælger poster fra de sidste 3 måneder kan se
ud som følger:

   SELECT IncidentNo FROM tblIncidentLog
   WHERE IncidentDate > DateAdd('m',-3,Now())

Hvis tabellen også indeholder poster med en dato der er nyere end
dags dato, kan man bruge between (som i dit eget eksempel):

   SELECT IncidentNo FROM tblIncidentLog
   WHERE IncidentDate BETWEEN DateAdd('m',-3,Now()) AND Now()

Begge ovenstående forespørgsler skal bare sendes som ren tekst til
databasen - så klarer den alle datoberegninger. Den første
forespørgsel vil fx se ud som følger i asp-koden:

strSQL = "SELECT IncidentNo FROM tblIncidentLog " & _
       "WHERE IncidentDate > DateAdd('m',-3,Now())"



Humlen er at man skal skelne mellem DateAdd, DateSerial, Now etc.
brugt i asp og de tilsvarende funktioner anvendt i Access. Hvis man
bruger asp-udgaverne, bliver datoværdier overført som tekst, og der
er risiko for konverteringsfejl (mellem dansk/europæisk format
dd/mm/yyyy og amerikansk format mm/dd/yyyy). Holder man sig til
Access-udgaverne, opstår disse problemer ikke.
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

Ukendt (24-10-2006)
Kommentar
Fra : Ukendt


Dato : 24-10-06 12:40


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns98667BDB5D493jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Henning Smed skrev:

>
> Tillykke - du har ramt én af mine kæpheste
>

Hej Jens

Mange tak.
Jeg er glad for at ramme en af dine kæpheste, det er jo langt mere simpelt
at bruge databasens funktion som du beskriver.

> Når det gælder datoer bør man altid - *altid* - prøve at holde sig
> til databasens datofunktioner. Det sparer dig for en masse
> potentielle konverteringsfejl.
>
> Enhver database har selv funktioner til at håndtere datoer - incl.
> en funktion til at generere dags dato (med og uden tid). I Access
> er det meget simpelt, da funktionerne er præcis de samme som i asp.
>
> En forespørgsel der udvælger poster fra de sidste 3 måneder kan se
> ud som følger:
>
> SELECT IncidentNo FROM tblIncidentLog
> WHERE IncidentDate > DateAdd('m',-3,Now())
>
Har du også en løsning så jeg kan få udskrevet "fra datoen" så jeg over min
tabel kan skrive:
xxx poster fra (fra dato) til (dagsdato) sorteret efter xxxxxx xxxx

M.v.h.
Henning



Jens Gyldenkærne Cla~ (24-10-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 24-10-06 13:50

Henning Smed skrev:

> Har du også en løsning så jeg kan få udskrevet "fra datoen" så
> jeg over min tabel kan skrive:
> xxx poster fra (fra dato) til (dagsdato) sorteret efter xxxxxx
> xxxx

Her ville jeg bare benytte datoen fra asp:

Dim dateNow, dateThen

dateNow = Now()
dateThen = DateAdd("m", -3, dateNow)

Response.write "xxx poster fra " & _
       FormatDateTime(dateThen, 2) & _
       " til " & _
       FormatDateTime(dateNow, 2) & _
   
I teorien kan det give en forskel på den dato der anvendes i asp og
den der anvendes i Access - men da det er samme maskine der
håndterer begge dele, er der ikke noget problem i praksis. Til
gengæld skal man nok sørge for at asp-datoerne vises "på dansk" -
se hvordan her: <http://asp-faq.dk/article/?id=47>.

Bruger man en database der ligger på en særskilt server (fx mysql,
mssql), er der lidt større risiko for at der er forskel på den
viste tid og den tid der anvendes i databasen (hvis de to serveres
ure ikke stemmer overens). Men det er kun et reelt problem hvis man
har brug for at vise tidspunkter med en præcision større end 1
sekund.
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

Ukendt (24-10-2006)
Kommentar
Fra : Ukendt


Dato : 24-10-06 14:08


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns986696DD2AE15jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Henning Smed skrev:
>
>> Har du også en løsning så jeg kan få udskrevet "fra datoen" så
>> jeg over min tabel kan skrive:
>> xxx poster fra (fra dato) til (dagsdato) sorteret efter xxxxxx
>> xxxx
>
> Her ville jeg bare benytte datoen fra asp:
>
> Dim dateNow, dateThen
>
> dateNow = Now()
> dateThen = DateAdd("m", -3, dateNow)
>
> Response.write "xxx poster fra " & _
> FormatDateTime(dateThen, 2) & _
> " til " & _
> FormatDateTime(dateNow, 2) & _
>
> I teorien kan det give en forskel på den dato der anvendes i asp og
> den der anvendes i Access - men da det er samme maskine der
> håndterer begge dele, er der ikke noget problem i praksis. Til
> gengæld skal man nok sørge for at asp-datoerne vises "på dansk" -
> se hvordan her: <http://asp-faq.dk/article/?id=47>.
>
Hej Jens

Tak, det er lige hvad jeg har brug for.
Siderne bruges både i Europa og USA så jeg anvender UTC tid med koden:

'Get time offset from server and calculate UTC time
nowLocal = now()
set oShell = CreateObject("WScript.Shell")
atb = "HKEY_LOCAL_MACHINE\System\CurrentControlSet\" &_
"Control\TimeZoneInformation\ActiveTimeBias"
offsetMin = oShell.RegRead(atb)
nowUTC = dateadd("n", offsetMin, nowLocal)
'Response.Write("Current = " & nowLocal & "<br>UTC = " & nowUTC)

Så min 'fra dato' (Server tid) vil være 3 måneder og 1 eller 2 timer
forskudt fra den aktuelle UTC tid (afhængig af om vi har sommertid), men
det betyder ikke noget om fra datoen skifter lidt forskudt.

Mange tak for din hjælp
Henning



Jørn Andersen (25-10-2006)
Kommentar
Fra : Jørn Andersen


Dato : 25-10-06 00:25

On Tue, 24 Oct 2006 10:39:41 +0200, "Henning Smed" <henning snabela
smeds.dk> wrote:

>Når jeg trækker 3 fra måneds værdien i 'DateSerial' vil jeg kunne få datoen
>31 februar og 31 dage i måneder med 30 dage, vil det give problemer ved DB
>opslag?
>
>Er der en anden måde at få en dato 3 måneder fra dags dato med korrekt antal
>dage i måneden?

Det kommer jo an på, hvad du ønsker skal være det korrekte
Det vil ikke give problemer i den forstand, at den vil give en
fejlmelding og sige "ugyldig dato".

Selv med fx DateSerial(2006, 17, 43), vil du få en dato. Selv om der
ikke er nogte, der hedder 17. måned og 43. dag - den returnerer bare
12.6.2007.

Når du bruger DateAdd med måneder, vil den "holde sig inden for
måneden". Fx:

datMinDato = DateSerial(2006, 10, 31)
datNyDato = DateAdd("m", -8, datMinDato)
- datNyDato bliver da 28.2.2006 (og ikke 31.2.2006)

Eksemplet er faktisk nævnt i dokumentationen

Så hvis det er hvad du ønsker skal være korrekt, så ...


Good luck!

--
Jørn Andersen,
Brønshøj

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste