Hi,
Aha, es ist mal wieder Zeit für mein Datums-bla bla
============
In Access werden die Datumsfelder intern definitv als Zahl Typ Double
gespeichert, wobei der Vorkomma-Anteil (positiv wie negativ) die Anzahl der
Tage seit dem 30.12.1899 bedeuten und der Nachkommateil die "Fraction" des
Tages, d.h. die Uhrzeit. (0,5 = 12 Uhr) Zur Anzeige des Datums rechnet
Access intern das Datum immer um... (D.h. es wird IMMER ein "Zeitpunkt"
gespeichert)
Wenn "NUR" die Uhrzeit abgespeichert wird, ist die Tagesanzahl
(Vorkommateil) gleich 0 und umgekehrt, bei Datum ohne Uhrzeit ist der
Nachkommaanteil immer 0, d.h. Mitternacht. ...
Zweistellig angezeigt wird das Jahr des Datums deswegen, weil Access
standardmäßig (wenn kein Extra-"Format" gesetzt wurde) zur Anzeige des
Datums den Wert, der in der Systemsteuerung unter "Ländereinstellungen" Tab
Datum unter "Kurzes Datumsformat" eingestellt ist, verwendet.
Für diese Umrechnung gibt es diverse accessinterne Datums- und
Uhrzeitfunktionen (siehe Onlinehilfe), als da beispielsweise wären:
DateSerial
TimeSerial
Year
Month
Day
DateDiff
DateAdd
DatePart
Format (Parameter firstFourDays und vbMonday nicht vergessen)
Now
Weekday (Parameter vbMonday nicht vergessen)
=================================
Aber ich bräuchte eine Funktion, die zu einem bestimmten Datum ausrechnet,
in welche KW dieses Datum fällt.
Das geht immer mit dem Format-Statement (siehe Online-Hilfe)
=================================
Aber ich bräuchte das Datum in einem SQL-String
Für SQL musst du immer das Datum in einen "String" umwandeln.
Hier helfen zwei kleine Funktionen weiter, die der KnowHow.mdb (siehe
Signatur) entnommen wurde
Wenn der Uhrzeit-Teil (wie bei der Funktion SQLDatum) fehlt, wird immer
Mitternacht (0 <Null> Uhr 0 <Null> Minuten und 0 <Null> Sekunden)
angenommen, wenn der UhrzeitTeil benötigt wird, so muss die Funktion
DateTimeForSQL verwendet werden. (Siehe auch Access-FAQ
http://www.donkarl.com Punkt 3.13)
Function SQLDatum(Datumx) As String
'Macht aus irgendeinem gültigen Datum einen String #yyyy-mm-dd# (ISO-Norm
Datum)
If IsDate(Datumx) Then
SQLDatum = Format(CDate(Datumx), "\#yyyy\-mm\-dd\#", vbMonday,
vbFirstFourDays)
Else
SQLDatum = ""
End If
End Function
Function DateTimeForSQL(dteDate) As String
'Datum incl. Uhrzeit für SQL und INI-Files als String
' DateTimeForSQL = Format(CDate(dteDate), "\#yyyy\-mm\-dd h:nn:ss AM/PM
\#", vbMonday, vbFirstFourDays)
DateTimeForSQL = Format(CDate(dteDate), "\#yyyy\-mm\-dd hh:nn:ss\#",
vbMonday, vbFirstFourDays)
End Function
=================================
Ist es richtig, dass die erste Kalenderwoche immer die erste Woche im Jahr
mit mindestens 4 Tagen ist?
Wann fängt die Kalenderwoche an? Montag, oder Sonntag?
Das ist weltweit nicht einheitlich geregelt.
Für WestEuropa (d.h. zumindest für alle Staaten der EG sowie der Schweiz)
gilt irgendeine ISO-Norm seit den 1970-er Jahren des letzten Jahrtausends
Diese ISO-Norm besagt, daß für alle Staaten, die dieser Norm "beigetreten"
sind, gilt, daß die WochenNr mit der Nummer 1 (In Worten: "eins") die Woche
ist, die vier Tage hat, bzw. (was das Gleiche ist) die den Donnerstag
beinhaltet (vbFirstFourDays). In dieser ISO-Norm ist auch festgelegt, daß
der erste Tag der Woche der Montag (und nicht wie davor der Sonntag) ist.
(vbMonday) Der erste Tag der Woche ist vorallem für Kalenderhersteller
wichtig, da in dieser Norm auch drinsteht, daß der erste Tag der Woche als
erstes in der Kalendertageaufstellung stehen sollte. (also Mo Di Mi ... und
nicht So Mo Di ...)
In den USA gilt beides NICHT, dort ist immer die Woche die Nr 1 (in
Worten:eins), die den ersten Januar beinhaltet und der erste Tag der Woche
ist der Sonntag.
Wie es die anderen Staaten (die z.Tl. noch nach einem ganz anderen Kalender
!!! rechnen wie China oder Israel oder so) halten, ist mir nicht bekannt.
Auch für Rußland und Indien etc. weiß ich es nicht. Wenn du also für deine
Applikation das richtige tun willst, hast du folgende Möglichkeiten:
Du verwendest beim Format immer den Parameter adUseSystem oder du fragst es
explizit in deinem Programm ab oder du weißt, in welcher "Hemisphäre" dein
Programm verwendet wird und verwendest diese Einstellung fix. (ich verwende
z.B. in der KnowHow die europäische Norm fix)
Die in dem anderen Posting gezeigte Methode:
KW = Format(Datum,"ww",2,3)
ist definitiv für Europa und USA falsch, entweder
Europäisch, aber besser Konstantennamen verwenden, also
KW = Format(Datum,"ww", vbMonday, VbFirstFourDays)
KW = Format(Datum,"ww",2,2)
oder in den USA, d.h. amerikanisch:
KW = Format(Datum,"ww", VbSunday, VbFirstJan1)
KW = Format(Datum,"ww", 1, 1)
KW = Format(Datum,"ww") - Kurzform da default
oder Systemeinstellung verwenden:
KW = Format(Datum,"ww", vbUseSystem, vbUseSystem)
KW = Format(Datum,"ww", 0, 0)
===========================================
ACHTUNG: vbUseSystem ist NICHT die Defaulteinstellung, sondern 1,1 !!!
===========================================
Aus dem gleichen Grund ist bei den Pivot-(Kreuztabellen)-Formularen in
Access (ab Acc 2003) Vorsicht geboten, da die dort angebotene Wochen-
Pivotierung sich IMMER auf die AMERIKANISCHE Wochennummer bezieht und
daher in Westeuropa UNBRAUCHBAR ist. MS ist dieser Fehler bekannt, er
wird aber weder in Access 2003 noch im kommenden Access 2007 behoben
werden.
Ebenso findet sich in der KnowHow (oder als neuere Version ein Extrakt
in der Datei ObdKalender.zip bei www.freeaccess.de) ein komplettes
Kalendermodul, mit dem man auch eigene Feier- und Werktagsberechnungen
vornehmen kann. (Beschreibung dazu im Inneren des Moduls
mdlSonstigesDatumUhrzeit)
In diese Gruppe gehört die UmkehrFunktion Fkt_KWMon aus dem Modul
mdlSonstigesDatumUhrzeit, mit deren Hilfe man den Montag einer
(europäischen) Kalenderwoche berechnen kann, das ich aus der Access-FAQ
entlehnt habe ...
--
mit freundlichen Grüßen aus Nürnberg
Klaus Oberdalhoff
Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99
Ich unterstütze SQL PASS Deutschland e.V. (http://www.sqlpass.de)
als Regionalverantwortlicher (Franken)
Nächstes Treffen in Nürnberg am 13.10.2009