Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datum zu KW Normierung (https://www.delphipraxis.net/173354-datum-zu-kw-normierung.html)

ibp 19. Feb 2013 14:49

Datum zu KW Normierung
 
Hallo, stehe gerade ziemlich auf dem Schlauch, das verflixte Jahr 2012 macht mir zu schaffen. Hintergrund das Jahr hat 2 x die KW 52 und 2 x KW 1

Ich suche eine mathematische Berechnung anhand der ich mittels eines Datums aus einem Bereich die Nummer 1...54 zuordnen kann.

Der Bereich kann von 1 Woche bis max. 1 Jahr betragen.

also nehmen wir an es ist der Bereich 5.2.2013 bis 29.3.2013 gewählt worden...

5.2. ist die KW 6 diese hat dann die Zuordnung 1
...
29.3. ist die KW 13 hat dann die Zuordnung 8

So weit so gut. Wenn ich nun das Jahr 2012 betrachte und den Zeitraum 1.1.2012-31.12.2012 wähle:

1.1.2012 KW 52 > 1
...
31.12.2012 KW 1 > 54


hat da jemand eine Idee?

Meine bisherige war eine Liste zu generieren anhand der die Zuordnung identifiziert wurde und zwar so...
liste[1..54] := YearOf(Date)*10000 + MonthOf(Date)*100 + WeekOf(Date)

das schlägt aber immer dann fehl wenn KW in verschiedenen Monaten vorhanden sind.

KarstenK 19. Feb 2013 14:56

AW: Datum zu KW Normierung
 
function WeekOf(const AValue: TDateTime): Word; {ISO 8601}

Sehe gerade hast Du ja verwendet. Verstehe aber dein Problem jetzt nicht wirklich.

knochen 19. Feb 2013 14:57

AW: Datum zu KW Normierung
 
Zitat:

Zitat von ibp (Beitrag 1204321)
Hallo, stehe gerade ziemlich auf dem Schlauch, das verflixte Jahr 2012 macht mir zu schaffen. Hintergrund das Jahr hat 2 x die KW 52 und 2 x KW 1

Das stimmt nicht.

ibp 19. Feb 2013 14:59

AW: Datum zu KW Normierung
 
Zitat:

Zitat von knochen (Beitrag 1204324)
Zitat:

Zitat von ibp (Beitrag 1204321)
Hallo, stehe gerade ziemlich auf dem Schlauch, das verflixte Jahr 2012 macht mir zu schaffen. Hintergrund das Jahr hat 2 x die KW 52 und 2 x KW 1

Das stimmt nicht.

wenn du es mit einer Formel berechnest schon.

ibp 19. Feb 2013 15:06

AW: Datum zu KW Normierung
 
Zitat:

Zitat von KarstenK (Beitrag 1204323)
function WeekOf(const AValue: TDateTime): Word; {ISO 8601}

Sehe gerade hast Du ja verwendet. Verstehe aber dein Problem jetzt nicht wirklich.

konnte es jetzt noch ein wenig einkreisen...da es ja nun doppelte KW gibt musste ich mir nun noch etwas dazu merken, hatte dabei aber zu kurz gedacht.
Also:
4.11.2012 ergibt 20121144 dem Wert ist der Rank 45 zugeordnet

Aber

29.10.2012 ergibt 20121044 da er ebenfalls in der 44 KW ist wird aber hier nicht gefunden, weil 20121144 in meiner Tabelle festgelegt wurde... :wall:

KarstenK 19. Feb 2013 15:35

AW: Datum zu KW Normierung
 
Hallo,

Aus meiner Sicht liefert weekof die gewünschte KW und die Liste ist nicht notwendig.
Du sprichts auch von einem Bereich.

Kannst Du in deiner Problembeschreibung einen Schritt zurück machen und sagen, was Du lösen möchtes.

ibp 19. Feb 2013 15:43

AW: Datum zu KW Normierung
 
Zitat:

Zitat von KarstenK (Beitrag 1204339)
Hallo,

Aus meiner Sicht liefert weekof die gewünschte KW und die Liste ist nicht notwendig.
Du sprichts auch von einem Bereich.

Kannst Du in deiner Problembeschreibung einen Schritt zurück machen und sagen, was Du lösen möchtes.

mit weekof(1.1.2012) erhalte ich 52
mit weekof(25.12.2012) erhalte ich 52

damit bekomme ich keine genaue Zuordnung hin, da es auch nicht hinreichend ist, den Monat als Erkennungsmerkmal mit dazu zu nehmen.

Im Endeffekt brauche ich eine Funktion die mir einen bestimmten Rank zurückgibt anhand eines Datums (Startdatum <= Datum <= Enddatum) der beginnt mit 1 beim Startdatum und geht bis maximal 54.

Union 19. Feb 2013 16:30

AW: Datum zu KW Normierung
 
Als "Zusatzschlüssel" musst Du das Jahr verwenden, in dem der größte Teil der ermittelte Woche liegt. Die Woche des 1. Jan 2012 war ja noch die KW 2011/52 da dieser Tag ein Sonntag war und bei einem definierten Wochenbeginn am Montag lagen eben 6 von 7 Tagen im Jahr 2011.

ibp 19. Feb 2013 16:50

AW: Datum zu KW Normierung
 
Zitat:

Zitat von Union (Beitrag 1204361)
Als "Zusatzschlüssel" musst Du das Jahr verwenden, in dem der größte Teil der ermittelte Woche liegt. Die Woche des 1. Jan 2012 war ja noch die KW 2011/52 da dieser Tag ein Sonntag war und bei einem definierten Wochenbeginn am Montag lagen eben 6 von 7 Tagen im Jahr 2011.

dann müsste ich aber jedes mal, bei jeder Abfrage und das sind einige, analysieren ob das nun ein Datum in der Nähe der Jahresgrenze ist. und dann entsprechend entscheiden...

Am liebsten wäre mir eine mathematische eindeutige Zuordnung ohne viel wenn und aber...

p80286 19. Feb 2013 16:53

AW: Datum zu KW Normierung
 
Das mit dem Rank ist mir etwas undurchsichtig.
Irgendwie scheint es je eben nicht um die x.KW des Jahres y zu gehen.

Zitat:

5.2. ist die KW 6 diese hat dann die Zuordnung 1
...
29.3. ist die KW 13 hat dann die Zuordnung 8
Das versteh ich überhaupt nicht.

Gruß
K-H

Union 19. Feb 2013 16:57

AW: Datum zu KW Normierung
 
Wenn ich es richtig verstehe willst den Benutzer als Selektionskriterium KW von-bis eingeben lassen und daraus den Datumsbereich errechnen? Dann gehört aber das Jahr dazum denn wie Du selbst gemerkt hast ist die KW alleine nicht eineindeutig.

BUG 19. Feb 2013 17:02

AW: Datum zu KW Normierung
 
Wenn ich richtig verstehe, sollte das ungefähr das machen, was du möchtest:
Delphi-Quellcode:
function pseudoKW(date: TDateTime): integer;
begin
  result = weekOf(date);
  if (result > 51) and (monthOf(date) = 1) then
    result = 0
  else if (result = 1) and (monthOf(date) = 12) then
    result = weekOf(incWeek(date, -1)) + 1;
end;

ibp 19. Feb 2013 17:03

AW: Datum zu KW Normierung
 
Zitat:

Zitat von Union (Beitrag 1204368)
Wenn ich es richtig verstehe willst den Benutzer als Selektionskriterium KW von-bis eingeben lassen und daraus den Datumsbereich errechnen? Dann gehört aber das Jahr dazum denn wie Du selbst gemerkt hast ist die KW alleine nicht eineindeutig.

genau umgekehrt. Es geht im Prinzip um Termine (Datum) die in einem Report der in KW aufgeteilt ist zugeordnet werden.

Die Grenzen können vom Anwender gewählt werden und sind Start-Datum bis End-Datum. Start bis Ende sind maximal 1 Jahr. Alle Termine sollen nun den entsprechenden KW zugeordnet werden.

Klassischer Fall Auswahl 1.1. - 31.12. aber es kann auch 5.5.2012 - 4.5.2013 ausgewählt werden oder aber auch eine kürzere Periode.

BUG 19. Feb 2013 17:18

AW: Datum zu KW Normierung
 
Dein Problem ist also, dass die Kombination aus Jahr und KW eine Woche nicht eindeutig kennzeichnet :idea:
Dann würde ich die KW so lassen wie sie sind und mir überlegen, wie du das Jahr, zu dem die Kalenderwoche gehört, ermittelst.

In MySQL geht das anscheinend mit YEARWEEK.

Furtbichler 19. Feb 2013 18:34

AW: Datum zu KW Normierung
 
Zitat:

Zitat von Union (Beitrag 1204361)
...Die Woche des 1. Jan 2012 war ja noch die KW 2011/52 da dieser Tag ein Sonntag war und bei einem definierten Wochenbeginn am Montag lagen eben 6 von 7 Tagen im Jahr 2011.

Nicht ganz
Zitat:

Zitat von Wiki
Zählweise nach DIN 1355/ISO 8601

Die deutschsprachige Kalender-Industrie hält sich ausnahmslos an die internationale Norm ISO 8601 (1973), die als letzten Tag der Woche den Sonntag bestimmt, statt des Samstags/Sonnabends/Sabbats, wie es in der jüdisch-christlich-islamischen Tradition üblich ist.

Im Geltungsbereich der Normen des DIN Deutschen Instituts für Normung e. V. werden seit 1976 durch Normung folgende Regeln empfohlen:
Jeden Montag und nur montags beginnt eine neue Kalenderwoche.
Die erste Kalenderwoche ist diejenige, die mindestens vier Tage des neuen Jahres enthält.

Aus diesen Punkten ergeben sich folgende Eigenschaften:
Es gibt keine unvollständigen Kalenderwochen, ausnahmslos jede KW enthält genau sieben Tage.
Jedes Jahr hat entweder 52 oder 53 Kalenderwochen.
Ein Jahr hat genau dann 53 Kalenderwochen, wenn es mit einem Donnerstag beginnt oder endet:
Ein Normaljahr mit 53 Wochen beginnt und endet an einem Donnerstag.
Ein Schaltjahr mit 53 Wochen beginnt entweder an einem Mittwoch und endet somit mit Donnerstag oder beginnt an einem Donnerstag und endet an einem Freitag.
Der 4. Januar liegt immer in Kalenderwoche 1.
Der 29., 30. und 31. Dezember können schon zur ersten Kalenderwoche des Folgejahres gehören.
Der 1., 2. und 3. Januar können noch in der letzten Kalenderwoche des Vorjahres liegen.
Der Donnerstag ist ausschlaggebend, zu welchem Jahr die Woche gezählt wird. Liegt er im neuen Jahr, ist es die Kalenderwoche 1.

Und da das nun mal so ist und Du doch niemandem zumuten willst, plötzlich mit Ordnungszahlenwochenranks zu arbeiten, hältst Du dich doch lieber an die Norm und machst das so wie alle anderen, oder etwa nicht?

Photoner 13. Jan 2014 13:01

AW: Datum zu KW Normierung
 
Ich bin zwar etwas spät dran mit meiner Antwort, aber vielleicht hilft es ja jemandem der zufällig hierüber stolpert:

Delphi-Quellcode:
uses DateUtils;
Delphi-Quellcode:
function WeekOfTheYear(const AValue: TDateTime; var AYear: Word): Word;
var
  LDOW: Word;
begin
  DecodeDateWeek(AValue, AYear, Result, LDOW);
end;
Liefert die KW nach ISO 8601 und das zugehörige Jahr. D.h. für den 30.12.2013 gibt die Funktion als Ergebnis die "1" zurück und der Variablen AYear wird die "2014" zugewiesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz