Ankündigung

Einklappen
Keine Ankündigung bisher.

Datumsangaben innerhalb eines Jahres selektieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datumsangaben innerhalb eines Jahres selektieren

    Hallo,
    entweder ich habe gerade n Brett vorm Kopf oder ich mache irgendwas banales falsch, jedenfalls brauche ich mal bitte Hilfe:

    Ich möchte in einer Tabelle eine Spalte "Zeitraum_von" und eine Spalte "Zeitraum_bis" definieren, die mir einen Zeitraum innerhalb des Jahres definieren an dem der Satz gültig ist.

    Dafür habe ich die mit diese Spalten als varchar(4) definiert mit Defaultwerten '0101' und '3112' für 01. Januar bzw. 31. Dezember und einen Dummysatz eingefügt.

    Nun möchte ich die Sätze selektieren, für die der heutige Tag in den Gültigkeitszeitraum fällt.

    Code:
    select DATE_FORMAT(now(),"%d%c");
    liefert mit das heutige Datum im entsprechenden Format, für den 23.12 also "2312".

    Wenn ich nun aber den folgendne Select ausführe

    Code:
    select * from table where von <= DATE_FORMAT(now(),"%d%c") and bis >= DATE_FORMAT(now(),"%d%c");
    so erhalte ich keine Sätze. Ich vermute es hängt irgendwie mit der Vergleichbarkeit der Strings zusammen.

    Hat jemand eine Idee?

    Grüße und frohe Weihnachtstage
    bish

  • #2
    Zitat von bish Beitrag anzeigen

    so erhalte ich keine Sätze. Ich vermute es hängt irgendwie mit der Vergleichbarkeit der Strings zusammen.

    Hat jemand eine Idee?

    Grüße und frohe Weihnachtstage
    bish
    Sowas ähnliches hatten wir erst vor wenigen Tagen, Thema "Wert wird nich ausgegen".

    Davon abgesehen ist es eine, sorry, strunzdumme Idee, Datumsangaben in Form von Strings zu speichern. Für Deine Anwendung wären Range-Type nett, steht alles am anderen Thread.


    Andreas

    Kommentar


    • #3
      Zum einen ist dein Datumsformat falsch (der 30.01. wäre größer als der 29.12.), zum anderen gibt's BETWEEN.
      WHERE NOW() BETWEEN date_from AND date_to

      Kommentar


      • #4
        Zitat von akretschmer Beitrag anzeigen
        Sowas ähnliches hatten wir erst vor wenigen Tagen, Thema "Wert wird nich ausgegen".

        Davon abgesehen ist es eine, sorry, strunzdumme Idee, Datumsangaben in Form von Strings zu speichern. Für Deine Anwendung wären Range-Type nett, steht alles am anderen Thread.


        Andreas
        Zitat von G.Schuster Beitrag anzeigen
        Zum einen ist dein Datumsformat falsch (der 30.01. wäre größer als der 29.12.), zum anderen gibt's BETWEEN.
        WHERE NOW() BETWEEN date_from AND date_to

        @G.Schuster Beim dem Vergleich könntest du recht haben

        @Beide Ihr habt nicht genau gelesen was ich möchte oder ich habe es nicht genau beschrieben. Insbesondere der von dir, Andreas, verwiesene Thread, behandelt eine etwas andere Thematik, denn ich habe wiederkehrende Zeiträume und nicht einmalige. Ich speichere somit auch keine Datumsangaben (dafür gibts die verschiedenen Date/Timestamp-Datentypen) sondern brauche eine Information über die Zeiträume.

        Ich habe nicht auf einem Zeitstrahl einzelne Zeitpunkte die ich dann wie G.Schuster schreibt mti Between und now vergleichen kann, sondern ich habe wiederkehrende Zeitpunkte.

        Um das zu verdeutlichen ein hoffentlich genaueres Beispiel:
        Mein Tabelle sieht so aus / soll so aussehen:
        Code:
        id, aktion_bezeichnung, gueltig_von, gueltig_bis
        1, "Weihnachtsaktion", 22.12, 26.12
        2, "Halloweenaktion", 31.10, 31.10
        ...
        Ohne Jahresangabe, da wiederkehrend. D.h. mein Selectqry soll mir sowohl 2012, 2013, 2014,.. im Zeitraum vom 22.12 bis 26.12 den Datensatz "Weihnachtsaktion" liefern. An allen anderen Tagen des Jahres soll dieser nicht selektiert werden.

        Bei dem anderem Thread mit dem Umsatz habe ich wirkliche Ereignisse auf einem festen Zeitstrahl, dies habe ich hier nicht!

        Ich hoffe das wird nun verständlicher

        Kommentar


        • #5
          Zitat von bish Beitrag anzeigen
          Dafür habe ich die mit diese Spalten als varchar(4) definiert mit Defaultwerten '0101' und '3112' für 01. Januar bzw. 31. Dezember und einen Dummysatz eingefügt.
          Das ist wirklich keine gute Idee. Das von G.Schuster angesprochene Problem könntest du lösen, indem du den Monat voranstellst (1229 > 0130) aber mit einem einfachen DATE_FORMAT und BETWEEN wirst du trotzdem nicht weit kommen. Was ist zum Beispiel mit Aktionen, die über das Jahresende hinausgehen, z.B. vom 27.12. bis 6.1. ?

          Hier ist ein interessanter Ansatz, wie der Datentyp DATE für solche Dinge gebraucht werden kann: http://stackoverflow.com/a/4998534/664108

          Code:
          select
              adddate(
              subdate(cast('0004-02-29' as date),
                  interval 4 year),
                  interval year(curdate()) year)
          
          result: 2012-02-28
          Der Ausdruck lässt sich mit Datums-Vergleichen so erweitern, dass er nicht immer das Datum im aktuellen Jahr nimmt sondern das nächste in der Zukunft (für "bis") bzw. das letzte in der Vergangenheit (für "von")

          Kommentar


          • #6
            BETWEEN arbeitet nicht nur mit Datumswerten.
            Und für den Jahreswechsel reicht ein OR (date_to < date_from AND NOW() > date_from)

            Kommentar


            • #7
              Code:
              SELECT
                 *
              FROM table
              WHERE
                 NOW()
                    BETWEEN
                       STR_TO_DATE(
                          CONCAT_WS('.', von, CAST( YEAR( NOW() ) ) AS CHAR ),
                          '%d.%m.%Y'
                       )
                    AND
                       STR_TO_DATE(
                          CONCAT_WS('.', bis, CAST( YEAR( NOW() ) ) AS CHAR ),
                          '%d.%m.%Y'
                       )

              Kommentar


              • #8
                Zitat von bish Beitrag anzeigen
                @Beide Ihr habt nicht genau gelesen was ich möchte oder ich habe es nicht genau beschrieben. Insbesondere der von dir, Andreas, verwiesene Thread, behandelt eine etwas andere Thematik, denn ich habe wiederkehrende Zeiträume und nicht einmalige. Ich speichere somit auch keine Datumsangaben (dafür gibts die verschiedenen Date/Timestamp-Datentypen) sondern brauche eine Information über die Zeiträume.
                Okay.

                http://www.justatheory.com/computers...ng_events.html

                Gut, das bezieht sich auf Events, aber mal so als Anregung. Jedenfalls halte ich es nie für eine gute Idee, Dinge in falschen Einheiten zu speichern, also z.B. ein Datum als String.

                Deine Lösung hat auch noch einen anderen Nachteil: zum einen sind nicht alle Feiertage fix wie Weihnachten, zum anderen kann ich mir vorstellen, daß es auch noch Abhängigkeiten vom jeweiligen Wochentag gibt.


                Andreas

                Andreas

                Kommentar


                • #9
                  Nachdem was ich hier lese sollte ich wirklich auf den Datentyp Date wechseln. Was mir dann nur nicht klar ist was ich im Insertstatement meiner Aktionen verwende bzw. Warum dann beim zeitvergleich das jahr nicht herangezogen werden soll. :/

                  Kommentar


                  • #10
                    Zitat von bish Beitrag anzeigen
                    Nachdem was ich hier lese sollte ich wirklich auf den Datentyp Date wechseln. Was mir dann nur nicht klar ist was ich im Insertstatement meiner Aktionen verwende bzw. Warum dann beim zeitvergleich das jahr nicht herangezogen werden soll. :/
                    Du definierst halt die Zeiträume mit korrektem Datum, und verwendest das auch im Select.

                    Code:
                    test=# select * from bish;
                     id |         gueltig
                    ----+-------------------------
                      1 | [2012-01-01,2012-01-31)
                      2 | [2012-02-01,2012-03-31)
                      3 | [2012-12-01,2012-12-20)
                      4 | [2012-12-10,2012-12-30)
                      5 | [2012-12-20,2013-01-02)
                    (5 rows)
                    
                    Time: 0,278 ms
                    test=*# select * from bish where gueltig @> current_date;
                     id |         gueltig
                    ----+-------------------------
                      4 | [2012-12-10,2012-12-30)
                      5 | [2012-12-20,2013-01-02)
                    (2 rows)
                    Jetzt mal mit DATERANGE für den Gültigkeitszeitraum, @> ist der CONTAINS-Operator.


                    Andreas

                    Kommentar


                    • #11
                      Zitat von akretschmer Beitrag anzeigen
                      Du definierst halt die Zeiträume mit korrektem Datum, und verwendest das auch im Select.

                      Code:
                      test=# select * from bish;
                       id |         gueltig
                      ----+-------------------------
                        1 | [2012-01-01,2012-01-31)
                        2 | [2012-02-01,2012-03-31)
                        3 | [2012-12-01,2012-12-20)
                        4 | [2012-12-10,2012-12-30)
                        5 | [2012-12-20,2013-01-02)
                      (5 rows)
                      
                      Time: 0,278 ms
                      test=*# select * from bish where gueltig @> current_date;
                       id |         gueltig
                      ----+-------------------------
                        4 | [2012-12-10,2012-12-30)
                        5 | [2012-12-20,2013-01-02)
                      (2 rows)
                      Jetzt mal mit DATERANGE für den Gültigkeitszeitraum, @> ist der CONTAINS-Operator.


                      Andreas

                      Was aber dann nur im Jahr 2012 funktioniert. Wenn ich im jahr 2013 die Abfrage ausführe erhalte ich kein Ergebnis - und genau diese Jahresabhängigkeit möchte ich ja nicht

                      Kommentar


                      • #12
                        Zitat von bish Beitrag anzeigen
                        Was aber dann nur im Jahr 2012 funktioniert. Wenn ich im jahr 2013 die Abfrage ausführe erhalte ich kein Ergebnis - und genau diese Jahresabhängigkeit möchte ich ja nicht
                        Ja, mußt halt immer eintragen. Aber: bei Halloween und Weihnachten mag das ja noch passen, festes Datum. Ostern, Pfingsten und Männertag aber nicht. Da wirst das eh jedes Jahr definieren müssen. Also, wo ist der Nachteil?

                        Andreas

                        Kommentar

                        Lädt...
                        X