Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: datumssprünge kalenderwochen, die woche 52...

  1. #1
    emanymton ist offline Neuer Benutzer
    Registriert seit
    14.09.2011
    Beiträge
    15

    Standard datumssprünge kalenderwochen, die woche 52...

    echo $gruss=tageszeit($time);

    Liebe Leute, leider hab ich noch ein kleines grosses Problem mit meinen PGSQL Abfragen.

    Folgende Code's:

    Code:
    select count (id) as anzahl, to_char(creation_date,'yyyy mm iw') as datum 
    from tbl_order 
    where 
    (creation_date between '2010-12-25 usw' and '2011-02-01 usw' ) 
    group by datum
     order by datum asc
    ergibt ,
    zumindest die zahlen sind richtig,
    1540
    2010 12 51
    3027
    2010 12 52
    5463
    2011 01 01
    ...
    647
    2011 01 05
    2524
    2011 01 52
    682
    2011 02 05




    Code:
    select count (id) as anzahl, to_char(creation_date,'yyyy iw') as datum
    from tbl_order
    where
    (creation_date between '2010-12-25 usw' and '2011-02-01 usw' )
    group by datum
    order by datum asc
    ergibt totalen Unsinn, beim datumssprung ueber
    mehrere jahre.

    Was an sich natuerlich richtig ist, allerdings beginnt hier mein Dilemma:
    Der Datumssprung von KW52 bzw 53 2010 auf KW53 auf 2011....

    woche 52(53 ?) von (2010) sollte hinzugezaehlt werden zu woche 52 von (Januar 2011)

    Ich bin hier leider ueberfordert, und moechte um Hilfe bitten.

    (anm: entschuldigung für den umlaut im titel)
    Geändert von emanymton (19.09.2011 um 13:54 Uhr)

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von emanymton Beitrag anzeigen
    echo $gruss=tageszeit($time);

    Liebe Leute, leider hab ich noch ein kleines grosses Problem mit meinen PGSQL Abfragen.

    Folgende Code's:

    Code:
    select count (id) as anzahl, to_char(creation_date,'yyyy mm iw') as datum 
    from tbl_order 
    where 
    (creation_date between '2010-12-25 usw' and '2011-02-01 usw' ) 
    group by datum
     order by datum asc
    ergibt ,
    zumindest die zahlen sind richtig,
    1540
    2010 12 51
    3027
    2010 12 52
    5463
    2011 01 01
    ...
    647
    2011 01 05
    2524
    2011 01 52
    682
    2011 02 05



    Code:
    select count (id) as anzahl, to_char(creation_date,'yyyy iw') as datum
    from tbl_order
    where
    (creation_date between '2010-12-25 usw' and '2011-02-01 usw' )
    group by datum
    order by datum asc
    ergibt totalen Unsinn, beim datumssprung ueber
    mehrere jahre.

    Was an sich natuerlich richtig ist, allerdings beginnt hier mein Dilemma:
    Der Datumssprung von KW52 bzw 53 2010 auf KW53 auf 2011....

    woche 52(53 ?) von (2010) sollte hinzugezaehlt werden zu woche 52 von (Januar 2011)

    Ich bin hier leider ueberfordert, und moechte um Hilfe bitten.
    Mir ist nicht ganz klar, was Dein Problem ist. Die Tatsache, daß die letzte KW eines Jahres auch mal in das folgende Jahr reichen kann? Das ist halt so festgelegt...
    Oder die Sortierfolge? Nun, Du hast ein sortierfähiges Datum vom passenden Datentyp, machst daraus einen nicht sortierfähigen String, und sortierst danach.
    PEBKAC, Layer8-Problem. Demo:

    Code:
    test=# select datum, to_char(datum, 'yyyy iw') from (select ('2010-12-28'::date + s * '1day'::interval)::date as datum from generate_series(0,10) s) foo order by to_char;
       datum    | to_char
    ------------+---------
     2010-12-28 | 2010 52
     2010-12-29 | 2010 52
     2010-12-30 | 2010 52
     2010-12-31 | 2010 52
     2011-01-07 | 2011 01
     2011-01-05 | 2011 01
     2011-01-06 | 2011 01
     2011-01-03 | 2011 01
     2011-01-04 | 2011 01
     2011-01-02 | 2011 52
     2011-01-01 | 2011 52
    (11 rows)

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von emanymton Beitrag anzeigen
    echo $gruss=tageszeit($time);

    Liebe Leute, leider hab ich noch ein kleines grosses Problem mit meinen PGSQL Abfragen.

    Folgende Code's:

    Code:
    select count (id) as anzahl, to_char(creation_date,'yyyy mm iw') as datum 
    from tbl_order 
    where 
    (creation_date between '2010-12-25 usw' and '2011-02-01 usw' ) 
    group by datum
     order by datum asc
    ergibt ,
    zumindest die zahlen sind richtig,
    1540
    2010 12 51
    3027
    2010 12 52
    5463
    2011 01 01
    ...
    647
    2011 01 05
    2524
    2011 01 52
    682
    2011 02 05




    Code:
    select count (id) as anzahl, to_char(creation_date,'yyyy iw') as datum
    from tbl_order
    where
    (creation_date between '2010-12-25 usw' and '2011-02-01 usw' )
    group by datum
    order by datum asc
    ergibt totalen Unsinn, beim datumssprung ueber
    mehrere jahre.

    Was an sich natuerlich richtig ist, allerdings beginnt hier mein Dilemma:
    Der Datumssprung von KW52 bzw 53 2010 auf KW53 auf 2011....

    woche 52(53 ?) von (2010) sollte hinzugezaehlt werden zu woche 52 von (Januar 2011)

    Ich bin hier leider ueberfordert, und moechte um Hilfe bitten.

    (anm: entschuldigung für den umlaut im titel)
    Ich versuch noch mal zu antworten, weil der erst Versuch wohl nicht klappte:

    Also, was ist Dein Problem?
    - daß die KW nicht an der Jahresgrenze wechselt? das ist so definiert.
    - daß die Sortierung nicht klappt? Nun, du machst aus einem sortierfähigem DATE einen nicht sortierfähigen STRING. Demo:

    Code:
    test=# select datum, to_char(datum, 'yyyy iw') from (select ('2010-12-28'::date + s * '1day'::interval)::date as datum from generate_series(0,10) s) foo order by to_char;
       datum    | to_char
    ------------+---------
     2010-12-28 | 2010 52
     2010-12-29 | 2010 52
     2010-12-30 | 2010 52
     2010-12-31 | 2010 52
     2011-01-07 | 2011 01
     2011-01-05 | 2011 01
     2011-01-06 | 2011 01
     2011-01-03 | 2011 01
     2011-01-04 | 2011 01
     2011-01-02 | 2011 52
     2011-01-01 | 2011 52
    (11 rows)

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    emanymton ist offline Neuer Benutzer
    Registriert seit
    14.09.2011
    Beiträge
    15

    Standard

    Entschuldigung bitte für die ungenaue Ausdrucksweise.
    Das die KW nicht am 31. Dez springt, ist mir durchaus bewusst, hier liegt nicht das Problem.
    Das Datum in einen String zu verwandeln und dannach zu sortieren funktioniert mit allen anderen
    Quantisierungsmöglichkeiten(Tage, Monate, Jahre) ganz gut, nur bei der Woche ergeben sich dank
    der Aufteilung auf 2 Monate aus anderen Jahren Probleme....

    Meine Aufgabenstellung wäre, folgende Ausgabe zu erreichen:

    ... ...
    2010 12 KW 51 12345
    2010 12 KW 52 + 2011 01 KW52 12345
    2011 01 KW 01 12345
    ... ...










    Ich hoffe, das macht Sinn? Danke auf jeden Fall.

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von emanymton Beitrag anzeigen
    Entschuldigung bitte für die ungenaue Ausdrucksweise.
    Das die KW nicht am 31. Dez springt, ist mir durchaus bewusst, hier liegt nicht das Problem.
    Das Datum in einen String zu verwandeln und dannach zu sortieren funktioniert mit allen anderen
    Quantisierungsmöglichkeiten(Tage, Monate, Jahre) ganz gut, nur bei der Woche ergeben sich dank
    der Aufteilung auf 2 Monate aus anderen Jahren Probleme....

    Meine Aufgabenstellung wäre, folgende Ausgabe zu erreichen:

    ... ...
    2010 12 KW 51 12345
    2010 12 KW 52 + 2011 01 KW52 12345
    2011 01 KW 01 12345
    ... ...










    Ich hoffe, das macht Sinn? Danke auf jeden Fall.
    PostgreSQL wäre nicht PostgreSQL, wenn sowas nicht gänge ;-)

    Code:
    test=*# select datum, case when extract(year from datum) = extract(year from datum + '1week'::interval) then to_char(datum, 'yyyy iw') else to_char(datum, 'yyyy iw') || ' und erste Woche neues Jahr' end from (select ('2010-12-20'::date + s * '1day'::interval)::date as datum from generate_series(0,20)s) foo;
       datum    |                case
    ------------+------------------------------------
     2010-12-20 | 2010 51
     2010-12-21 | 2010 51
     2010-12-22 | 2010 51
     2010-12-23 | 2010 51
     2010-12-24 | 2010 51
     2010-12-25 | 2010 51 und erste Woche neues Jahr
     2010-12-26 | 2010 51 und erste Woche neues Jahr
     2010-12-27 | 2010 52 und erste Woche neues Jahr
     2010-12-28 | 2010 52 und erste Woche neues Jahr
     2010-12-29 | 2010 52 und erste Woche neues Jahr
     2010-12-30 | 2010 52 und erste Woche neues Jahr
     2010-12-31 | 2010 52 und erste Woche neues Jahr
     2011-01-01 | 2011 52
     2011-01-02 | 2011 52
     2011-01-03 | 2011 01
     2011-01-04 | 2011 01
     2011-01-05 | 2011 01
     2011-01-06 | 2011 01
     2011-01-07 | 2011 01
     2011-01-08 | 2011 01
     2011-01-09 | 2011 01
    (21 rows)
    Das an Deine Wünsche anzupassen überlasse ich Dir zur Übung ;-)


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    PostgreSQL wäre nicht PostgreSQL, wenn sowas nicht gänge ;-)

    Code:
    test=*# select datum, case when extract(year from datum) = extract(year from datum + '1week'::interval) then to_char(datum, 'yyyy iw') else to_char(datum, 'yyyy iw') || ' und erste Woche neues Jahr' end from (select ('2010-12-20'::date + s * '1day'::interval)::date as datum from generate_series(0,20)s) foo;
       datum    |                case
    ------------+------------------------------------
     2010-12-20 | 2010 51
     2010-12-21 | 2010 51
     2010-12-22 | 2010 51
     2010-12-23 | 2010 51
     2010-12-24 | 2010 51
     2010-12-25 | 2010 51 und erste Woche neues Jahr
     2010-12-26 | 2010 51 und erste Woche neues Jahr
     2010-12-27 | 2010 52 und erste Woche neues Jahr
     2010-12-28 | 2010 52 und erste Woche neues Jahr
     2010-12-29 | 2010 52 und erste Woche neues Jahr
     2010-12-30 | 2010 52 und erste Woche neues Jahr
     2010-12-31 | 2010 52 und erste Woche neues Jahr
     2011-01-01 | 2011 52
     2011-01-02 | 2011 52
     2011-01-03 | 2011 01
     2011-01-04 | 2011 01
     2011-01-05 | 2011 01
     2011-01-06 | 2011 01
     2011-01-07 | 2011 01
     2011-01-08 | 2011 01
     2011-01-09 | 2011 01
    (21 rows)
    Das an Deine Wünsche anzupassen überlasse ich Dir zur Übung ;-)


    Andreas
    Änder das SQL mal in

    Code:
    test=*# select datum, case when to_char(datum, 'iw')::int < to_char(datum + '1week'::interval,'iw')::int then to_char(datum, 'yyyy iw') else to_char(datum, 'yyyy iw') || ' und erste Woche neues Jahr' end from (select ('2011-12-20'::date + s * '1day'::interval)::date as datum from generate_series(0,20)s) foo;
    das kommt der Sache dann näher ...

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    emanymton ist offline Neuer Benutzer
    Registriert seit
    14.09.2011
    Beiträge
    15

    Standard

    entschuldige Andreas, aber
    leider ist das nicht, was ich benötige
    (bzw die Antwort ist für mich zu schwer
    (bzw ich sollte genauer sein bei meinen Fragen)

    ... ...
    2010 12 KW 51 = count(rows) mit to_char(datum,'YYYY MM iW')='2010 12 51'
    2010 12 KW 52 = count(rows) mit to_char(datum,'YYYY MM iW')='2010 12 52' +count(rows) mit to_char(datum,'YYYY MM iW')='2011 01 52'
    2011 01 KW 01 = count(rows) mit to_char(datum,'YYYY MM iW')='2011 01 01'
    2011 02
    KW 02
    = count(rows) mit to_char(datum,'YYYY MM iW')='2011 01 02'
    ... ...














    (PQSQL kann das sicher, aber ich nicht...)
    Geändert von emanymton (19.09.2011 um 15:58 Uhr)

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von emanymton Beitrag anzeigen
    entschuldige Andreas, aber
    leider ist das nicht, was ich benötige
    (bzw die Antwort ist für mich zu schwer
    (bzw ich sollte genauer sein bei meinen Fragen)

    ... ...
    2010 12 KW 51 = count(rows) mit to_char(datum,'YYYY MM iW')='2010 12 51'
    2010 12 KW 52 = count(rows) mit to_char(datum,'YYYY MM iW')='2010 12 52' +count(rows) mit to_char(datum,'YYYY MM iW')='2011 01 52'
    2011 01 KW 01 = count(rows) mit to_char(datum,'YYYY MM iW')='2011 01 01'
    2011 02
    KW 02
    = count(rows) mit to_char(datum,'YYYY MM iW')='2011 01 02'
    ... ...














    (PQSQL kann das sicher, aber ich nicht...)
    Du willst also gruppieren, und zwar nach der KW, wenn diese aber die erste oder letzte eines Jahres ist dann diese 2 Wochen zusammengefaßt.

    Okay, dann nenne ich dies mal KW 0, denn die gibt es ja sonst nicht:

    Code:
    test=*# select datum, to_char(datum, 'yyyy mm iw'), case when to_char(datum, 'iw')::int in (1,52) then 0 else to_char(datum, 'iw')::int end from (select ('2011-12-20'::date + s * '1day'::interval)::date as datum from generate_series(0,20)s) foo;
    Reicht das nun als Lösungsansatz?

    Ansonsten zeige hier Tabellendefinition und Insert-Befehle (Copy-und-Past - fähig) und Dein Wunschresultat.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    emanymton ist offline Neuer Benutzer
    Registriert seit
    14.09.2011
    Beiträge
    15

    Standard

    Meine Aufgabenstellung:
    Zaehle Datensaetze, gruppiert nach Woche

    Tabelle orders
    ID- Int, unique
    datum- timestamp without tz

    quasi
    Code:
    select count (id) as ZAHL_DIE_RAUSKOMMEN_SOLL from orders 
    group by to_char      (XXX)
    Woche 52 des Vorjahres enthaelt einige Tage diesen Jahres.

    Bei Gruppierung nach Jahr & Woche:

    Code:
     select count (id) as ZAHL_DIE_RAUSKOMMEN_SOLL , 
    to_char(datum,'yyyy iw') as BEREICH
     from orders 
    where (datum between '2009-12-25 00:00:00.000000' and '2011-08-25 23:59:59.999999' ) 
     group by  BEREICH 
    order by  BEREICH asc
    kommt folgende tabelle raus:

    ZDRS BEREICH
    308
    2009 52
    301
    2009 53
    784
    2010 01
    648
    2010 02
    ... ...
    4888
    2010 50
    3990
    2010 51
    3027
    2010 52
    433
    2010 53
    5463
    2011 01
    4195 2011 02
    4442 2011 03
    ...
    ...
    2524
    2011 52









    Das hier in rot ist quatsch.(das in grün genauso, aber hier egal)
    In Wirklichkeit handelt es sich nicht um die 52. Woche des Jahres 2011
    ,
    sondern um die Tage, die von 2010 KW52 rueberhaengen nach 2011.

    Anderer Loesungsweg:
    Code:
     select count (id) as ZAHL_DIE_RAUSKOMMEN_SOLL , 
    to_char(datum,'yyyy MM iw') as BEREICH
     from orders 
    where ( datum between '2009-12-25 00:00:00.000000' and '2011-08-25 23:59:59.999999' ) 
     group by  BEREICH 
    order by  BEREICH asc
    ergibt

    308
    2009 12 52
    301
    2009 12 53
    784
    2010 01 01
    648
    2010 01 02
    717
    2010 01 03
    727
    2010 01 04
    ...
    ...
    433
    2010 01 53
    697
    2010 02 05
    777
    2010 02 06
    3990
    2010 12 51
    3027
    2010 12 52
    5463
    2011 01 01
    4779
    2011 01 02
    5126
    2011 01 03
    5396
    2011 01 04
    6470
    2011 01 05
    2524
    2011 01 52
    4660
    2011 02 05








    das ist besser, (zumindest die Zahlen werden richtig abgefragt)
    allerdings muessen die werte in rot und gruen jeweils addiert werden damit das ganze am Ende so aussieht:

    308
    2009 12 52
    734
    2009 12 53
    784
    2010 01 01
    648
    2010 01 02
    717
    2010 01 03
    727
    2010 01 04
    ...
    ...
    697
    2010 02 05
    777
    2010 02 06
    3990
    2010 12 51
    5551
    2010 12 52
    5463
    2011 01 01
    4779
    2011 01 02
    5126
    2011 01 03
    5396
    2011 01 04
    6470
    2011 01 05
    4660
    2011 02 05





    also Summe (letzte KW des Vorjahres+Tage die dr�berh�ngen in dieses Jahr)

    (nur diese be*** Einteilung in Wochen macht solche Probleme...)
    besser?
    Geändert von emanymton (19.09.2011 um 17:32 Uhr)

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von emanymton Beitrag anzeigen
    Meine Aufgabenstellung:
    Zaehle Datensaetze, gruppiert nach Woche

    Tabelle orders
    ID- Int, unique
    datum- timestamp without tz

    quasi
    Code:
    select count (id) as ZAHL_DIE_RAUSKOMMEN_SOLL from orders 
    group by to_char      (XXX)
    Woche 52 des Vorjahres enthaelt einige Tage diesen Jahres.

    Bei Gruppierung nach Jahr & Woche:

    Code:
     select count (id) as ZAHL_DIE_RAUSKOMMEN_SOLL , 
    to_char(datum,'yyyy iw') as BEREICH
     from orders 
    where (datum between '2009-12-25 00:00:00.000000' and '2011-08-25 23:59:59.999999' ) 
     group by  BEREICH 
    order by  BEREICH asc
    kommt folgende tabelle raus:

    ZDRS BEREICH
    308
    2009 52
    301
    2009 53
    784
    2010 01
    648
    2010 02
    ... ...
    4888
    2010 50
    3990
    2010 51
    3027
    2010 52
    433
    2010 53
    5463
    2011 01
    4195 2011 02
    4442 2011 03
    ...
    ...
    2524
    2011 52









    Das hier in rot ist quatsch.(das in grün genauso, aber hier egal)
    In Wirklichkeit handelt es sich nicht um die 52. Woche des Jahres 2011
    ,
    sondern um die Tage, die von 2010 KW52 rueberhaengen nach 2011.

    Anderer Loesungsweg:
    Code:
     select count (id) as ZAHL_DIE_RAUSKOMMEN_SOLL , 
    to_char(datum,'yyyy MM iw') as BEREICH
     from orders 
    where ( datum between '2009-12-25 00:00:00.000000' and '2011-08-25 23:59:59.999999' ) 
     group by  BEREICH 
    order by  BEREICH asc
    ergibt

    308
    2009 12 52
    301
    2009 12 53
    784
    2010 01 01
    648
    2010 01 02
    717
    2010 01 03
    727
    2010 01 04
    ...
    ...
    433
    2010 01 53
    697
    2010 02 05
    777
    2010 02 06
    3990
    2010 12 51
    3027
    2010 12 52
    5463
    2011 01 01
    4779
    2011 01 02
    5126
    2011 01 03
    5396
    2011 01 04
    6470
    2011 01 05
    2524
    2011 01 52
    4660
    2011 02 05








    das ist besser, (zumindest die Zahlen werden richtig abgefragt)
    allerdings muessen die werte in rot und gruen jeweils addiert werden damit das ganze am Ende so aussieht:

    308
    2009 12 52
    734
    2009 12 53
    784
    2010 01 01
    648
    2010 01 02
    717
    2010 01 03
    727
    2010 01 04
    ...
    ...
    697
    2010 02 05
    777
    2010 02 06
    3990
    2010 12 51
    5551
    2010 12 52
    5463
    2011 01 01
    4779
    2011 01 02
    5126
    2011 01 03
    5396
    2011 01 04
    6470
    2011 01 05
    4660
    2011 02 05





    also Summe (letzte KW des Vorjahres+Tage die dr�berh�ngen in dieses Jahr)

    (nur diese be*** Einteilung in Wochen macht solche Probleme...)
    besser?
    Also, wenn ich Dich richtig versteh, brauchst eine Gruppierung nach der KW, auch wenn diese über den Jahreswechsel geht. Wie wäre es z.B. mit Jahr und KW zu Begin der KW?

    Code:
    select *,extract(week from datum), to_char(extract(week from datum),'09') || '_' || extract(year from date_trunc('week', datum))::text from (select ('2010-12-20'::date + s * '1day'::interval)::date as datum from generate_series(0,20)s)foo;

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 19.05.2011, 19:32
  2. Antworten: 4
    Letzter Beitrag: 29.09.2010, 08:20
  3. Kalenderwochen-Funktion
    Von basti123456 im Forum SQL
    Antworten: 6
    Letzter Beitrag: 22.06.2006, 10:37

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum