Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Datumsvergleich, Datum aus mehreren Spalten zusammen bauen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Datumsvergleich, Datum aus mehreren Spalten zusammen bauen

    Hallo Leute,

    also ich habe einige Tabellen in denen ein Datum beispielsweise auf drei Spalten (int)Day,(int)Month,(int)Year aufgeteilt ist. Auf der anderen Seite ein beliebiges Datum das ich in jedes Format bringen kann.

    Nun will ich beide vergleichen was ich aber aufgrund der fehlenden Null bei den Werten von 1-9 noch nicht hinbekommen hab?


  • #2
    Moin Gonk,

    wieso hast du dein Datum in 3 Spalte aufgeteilt? Nutze doch einfach einen Timestamp. Du hast dort 2 Möglichkeiten.

    Entweder du nutzt einen UNIX-Timestamp alá: '1270550045' oder du nutzt einen normalen "mysql" timestamp alá: '2010-04-06 12:35:00'.

    Beides läßt sich ohne Probleme schon im SQL Query umrechnen:

    Beispiel:

    Code:
    FROM_UNIXTIME(1270550045) ergibt  '2010-04-06 12:35:00'
    oder

    Code:
    UNIX_TIMESTAMP( '2010-04-06 12:35:00') ergibt '1270550045'
    Sollte dir das alles net weiterhelfen und du MUSST die 3 Spalten benutzen, schaue doch einfach mal nach dem PHP Befehl mktime. Damit kannst du aus einzelenen Werten einen UNIX Timestamp erstellen.

    Grüße SouthsideDevil
    LINUX is like a wigwam - No Windows, No Gates and a Apache inside.

    Kommentar


    • #3
      Danke für die fixe antwort.

      Also ja ich habe keine Möglichkeit die Struktur der Tabellen zu ändern.

      Und ich bin auf der Suche nach einer Lösung in sql, falls denn sowas geht.

      Kommentar


      • #4
        Auf SQL-Basis wird sowas schon gehen, aber da ist mktime meiner Meinung nach leichter.

        SQL-Date
        ACHTUNG!!! SIGNATUR!!!
        PHP-Code:
        var_dump($gehirn); exit; 
        0 ??? WTF ? nervtag.de | freutag.net | friendmetr.com

        Kommentar


        • #5
          Zitat von Gonk Beitrag anzeigen
          Also ja ich habe keine Möglichkeit die Struktur der Tabellen zu ändern.
          Dann mach das - nutze einen der Datumstypen, den die Datenbank dir bereitstellt.


          Zitat von MaiKaY Beitrag anzeigen
          Auf SQL-Basis wird sowas schon gehen, aber da ist mktime meiner Meinung nach leichter.
          Nein, ist es ganz und gar nicht.

          Mit den Datumstypen der Datenbank kannst du auch die Datumsfunktionen der DB nutzen, und die erleichtern eine Vielzahl von Auswertungen und Abfragen bzgl. des Datums ganz erheblich.

          Wenn man hingegen nur Unix-Timestamps speichert, muss man die vorher jedes mal explizit umwandeln, oder man fängt an in PHP Berechnungen und Auswertungen nachzubilden, die man bequem der DB überlassen könnte. Deshalb ist das absolut nicht empfehlenswert.

          Kommentar


          • #6
            Auf SQL-Basis wird sowas schon gehen, aber da ist mktime meiner Meinung nach leichter.
            ACHTUNG!!! SIGNATUR!!!
            PHP-Code:
            var_dump($gehirn); exit; 
            0 ??? WTF ? nervtag.de | freutag.net | friendmetr.com

            Kommentar


            • #7
              Ja, schön dass du das betonst - ich möchte trotzdem Neulinge davon abhalten, es falsch zu machen, weil irgendjemand hier eine „Meinung“ hat und äussert, obwohl diese nicht fundiert ist und gängiger Praxis widerspricht.

              Kommentar


              • #8
                Zitat von ChrisB Beitrag anzeigen
                Dann mach das - nutze einen der Datumstypen, den die Datenbank dir bereitstellt.
                Was? Ich kann die Tabellen nicht verändern, ich kriege die Daten in der Form und muss sie auswerten.

                Kommentar


                • #9
                  Ach so, ich dachte du könntest.


                  Was dein Problem mit den Nullen ist, hast du immer noch nicht nachvollziehbar beschrieben.
                  Entweder du arbeitest auf beiden Seiten mit, oder auf beiden Seiten ohne führende Nullen. Wo da die Problematik sein soll, liegt immer noch im Nebel.

                  Kommentar


                  • #10
                    Ich habe ein kleines Beispiel zusammen gestellt und hoffe es entspricht Deinen Anforderungen:

                    Code:
                    CREATE TABLE test_datum (
                     tag INT NOT NULL,
                     monat INT NOT NULL,
                     jahr INT NOT NULL
                    );
                    
                    INSERT INTO test_datum VALUES
                    ( 1, 2, 2007), 
                    ( 31, 5, 2008), 
                    ( 20, 11, 2009);
                    
                    
                    SELECT DATE(
                            CONCAT(
                             RIGHT(CONCAT('0000', CAST(jahr AS CHAR(4))),4), '-',
                             RIGHT(CONCAT('00', CAST(monat AS CHAR(2))),2), '-',
                             RIGHT(CONCAT('00', CAST(tag AS CHAR(2))),2)
                            )
                           ) AS datum
                      FROM test_datum
                     WHERE DATE(
                            CONCAT(
                             RIGHT(CONCAT('0000', CAST(jahr AS CHAR(4))),4), '-',
                             RIGHT(CONCAT('00', CAST(monat AS CHAR(2))),2), '-',
                             RIGHT(CONCAT('00', CAST(tag AS CHAR(2))),2)
                            )
                           ) BETWEEN '2008-01-01' AND '2008-12-31';
                           
                    +------------+
                    | datum      |
                    +------------+
                    | 2008-05-31 |
                    +------------+
                    1 row in set (0.02 sec)
                    
                    mysql>
                    Grüße
                    Thomas

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Was dein Problem mit den Nullen ist, hast du immer noch nicht nachvollziehbar beschrieben.
                      Ganz einfach: 2010-1-2 != 2010-01-02

                      Zitat von thomas_w Beitrag anzeigen
                      Ich habe ein kleines Beispiel zusammen gestellt und hoffe es entspricht Deinen Anforderungen:

                      Code:
                      CREATE TABLE test_datum (
                       tag INT NOT NULL,
                       monat INT NOT NULL,
                      ...
                      Sowas in der Art habe ich gesucht/gemeint, danke für die Mühe.
                      Ich wert mich gleich mal ransetzen.

                      Kommentar


                      • #12
                        Code:
                         DATE(
                                CONCAT(
                                 RIGHT(CONCAT('0000', CAST(jahr AS CHAR(4))),4), '-',
                                 RIGHT(CONCAT('00', CAST(monat AS CHAR(2))),2), '-',
                                 RIGHT(CONCAT('00', CAST(tag AS CHAR(2))),2)
                                )
                               )
                        Das war/ist die Lösung, also nochmal vielen dank an thomas_w.

                        Kommentar


                        • #13
                          Code:
                          SELECT DATE(
                                  CONCAT(
                                   RIGHT(CONCAT('0000', CAST(jahr AS CHAR(4))),4), '-',
                                   RIGHT(CONCAT('00', CAST(monat AS CHAR(2))),2), '-',
                                   RIGHT(CONCAT('00', CAST(tag AS CHAR(2))),2)
                                  )
                                 ) AS datum
                            FROM test_datum
                           WHERE DATE(
                                  CONCAT(
                                   RIGHT(CONCAT('0000', CAST(jahr AS CHAR(4))),4), '-',
                                   RIGHT(CONCAT('00', CAST(monat AS CHAR(2))),2), '-',
                                   RIGHT(CONCAT('00', CAST(tag AS CHAR(2))),2)
                                  )
                                 ) BETWEEN '2008-01-01' AND '2008-12-31';
                          Grusel

                          Also ich bin immer noch für vernünftige Datumsfelder.
                          Ansonsten ginge vielleicht noch:

                          tag + monat*100 + jahr*10000.

                          Und dann ein INT-Vergleich. Wenn Dein Jahr wider Erwarten nicht 4-stellig ist, nutzen Dir führende Nullen ohnehin nur beim Stringvergleich.

                          PS:

                          Statt

                          RIGHT(CONCAT('00', CAST(tag AS CHAR(2))),2)

                          ginge auch:

                          IF(tag < 10 , CONCAT('0' , tag) , tag)
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Wozu der Aufwand? MySQL ergänzt doch eigenständig fehlende Nullen.

                            Code:
                            SELECT DATE(CONCAT('10', '-', '4', '-', '7'))
                            '2010-04-07'

                            Kommentar


                            • #15
                              Zitat von hpf Beitrag anzeigen
                              Wozu der Aufwand? MySQL ergänzt doch eigenständig fehlende Nullen.

                              Code:
                              SELECT DATE(CONCAT('10', '-', '4', '-', '7'))
                              Stimmt, funktioniert auch ohne die ganze Formatierung. Muss ich mal mit anderen Datenbanken testen, ob dies ein besonderes Feature von MySQL ist.

                              Code:
                              mysql> SELECT DATE(
                                  ->         CONCAT(
                                  ->          CAST(jahr AS CHAR(4)), '-',
                                  ->          CAST(monat AS CHAR(2)), '-',
                                  ->          CAST(tag AS CHAR(2))
                                  ->         )
                                  ->        ) AS datum
                                  ->   FROM test_datum
                                  ->  WHERE DATE(
                                  ->         CONCAT(
                                  ->          CAST(jahr AS CHAR(4)), '-',
                                  ->          CAST(monat AS CHAR(2)), '-',
                                  ->          CAST(tag AS CHAR(2))
                                  ->         )
                                  ->        ) BETWEEN '2008-01-01' AND '2008-12-31';
                              +------------+
                              | datum      |
                              +------------+
                              | 2008-05-31 |
                              +------------+
                              1 row in set (0.01 sec)
                              
                              mysql>
                              ORACLE-Test
                              Funktioniert so ähnlich auch mit ORACLE

                              Code:
                              SELECT TO_DATE('2010' || '-' || '1' || '-' || '1','YYYY-MM-DD') FROM dual;
                              
                              => 01-JAN-10


                              Grüße
                              Thomas

                              Kommentar

                              Lädt...
                              X