Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Zeitdifferenz zweiter Timestamps

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Zeitdifferenz zweiter Timestamps

    Moin,

    ich habe in meiner Tabelle zwei Timestamps, "starttime" und "endtime".

    Nun würde ich gerne die Differenz der beiden in Sekunden haben.
    Eigentlich einfach subtrahieren, dachte ich mir... aber Pustekuchen!

    Ich habe das Problem, dass er offensichtlich eine Minute als 100 Sekunden ansieht...

    Daten in der Tabelle:

    starttime | endtime
    2009-01-07 00:47:06 | 2009-01-07 00:47:22
    2009-01-07 00:50:37 | 2009-01-07 00:52:14

    Meine SQL Abfrage lautet:

    Code:
    SELECT  `endtime`  -  `starttime`  AS dauer FROM  `sessions` LIMIT 2;
    Als Ergebnis bekomme ich:

    16 (richtig!)
    177 (falsch!)

    Wenn ich den zweiten Wert nun nachrechne, und für eine Minute 100 Sekunden nehme, kommt das Ergebnis hin, aber das will ich so nicht...

    Eingetragen wurden die Daten jeweils mittels now().

    Wie bekomme ich nun die Differenz in Sekunden hin?

    Gruß

    Daniel

  • #2
    Kann doch nicht sein. Sind das DATETIME Felder? Benutzt er möglicherweise einfach nur nen anderen Datensatz? Lass Dir zur Kontrolle mal die beiden Subtrahenden mit ausgeben.

    Kommentar


    • #3
      Nein. Die Felder sind TIMESTAMP.

      Hier einmal die Tabelle:

      Code:
      CREATE TABLE IF NOT EXISTS `sessions` (
        `id` int(11) NOT NULL auto_increment,
        `guid` varchar(60) NOT NULL,
        `starttime` timestamp NOT NULL default CURRENT_TIMESTAMP,
        `endtime` timestamp NULL default NULL,
        PRIMARY KEY  (`id`)
      ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
      
      --
      -- Daten für Tabelle `sessions`
      --
      
      INSERT INTO `sessions` (`id`, `guid`, `starttime`, `endtime`) VALUES
      (12, 'a7d9b34838c27f36ec311deb1971d624', '2009-01-07 00:50:37', '2009-01-07 00:52:14'),
      (11, 'a7d9b34838c27f36ec311deb1971d624', '2009-01-07 00:47:06', '2009-01-07 00:47:22');
      Und hier auch nochmal die Kontrolle:

      dauer | endtime | starttime
      177 | 2009-01-07 00:52:14 | 2009-01-07 00:50:37
      16 | 2009-01-07 00:47:22 | 2009-01-07 00:47:06

      SQL Befehl:

      Code:
          SELECT  `endtime`  -  `starttime`  AS dauer, 
      endtime , 
      starttime FROM  `sessions` 
      LIMIT 0 , 30

      Kommentar


      • #4
        SELECT UNIX_TIMESTAMP(endtime) - UNIX_TIMESTAMP(starttime) AS dauer FROM `sessions` LIMIT 2;

        Kommentar


        • #5
          Hmm, aber:
          TIMESTAMP values are stored as the number of seconds since the epoch

          Kommentar


          • #6
            @Nikosch: woher haste das denn? Ich hab gerade mal ein Datetime-Feld von mir auf Timestamp geändert, sieht noch genau so aus wie vorher

            EDIT:
            doch nicht, der phpMyAdmin (oder die MySQL) hat mir jetzt ON UPDATE CURRENT_TIMESTAMP gesetzt, aber die Inhalte sind gleich geblieben

            Kommentar


            • #7
              Aus dem 5.1. Manual, Data Type Overview.
              Ja, die Repräsentation mag ja so sein. Aber die Speicherung erfolgt in Sekunden, deswegen sollte es mich wundern, wenn die Differenz falsch wäre.
              A TIMESTAMP value is returned as a string in the format 'YYYY-MM-DD HH:MM:SS' with a display width fixed at 19 characters.
              Vielleicht wäre das trotzdem nen Versuch wert:
              To obtain the value as a number, you should add +0 to the timestamp column.

              Kommentar


              • #8
                das is ja lustig

                Kommentar


                • #9
                  Der timestamp ist nicht der unix_timestamp. Mysql macht bei der bei der Berechnung nix anderes als

                  Code:
                  2009-01-07 00:52:14 | 2009-01-07 00:50:37
                  
                  zu
                  
                  20090107005214 | 20090107005037
                  Klar woher der Fehler kommt?

                  Um mit mysql timestamps rechnen zu können muss man die passenden Funktionen nehmen. Das wäre hier:
                  PHP-Code:
                  TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)

                  TIMESTAMPDIFF(SECONDS,starttime,endtime

                  Kommentar


                  • #10
                    Da hat er Recht, habs gerade getestet. Das gleiche Verhalten ist auch bei DATETIME + 0. Meine o.g. Variante dürfte trotzdem funktionieren.

                    Kommentar


                    • #11
                      Dann ist das Manual aber sehr ungenau. Und ganz kann das mit dem 20090107005214 auch nicht stimmen. Man betrachte den letzten Satz. Irgendwie muß da zumindest noch ein Offset eingebaut sein.

                      TIMESTAMP values are stored as the number of seconds since the epoch ('1970-01-01 00:00:00' UTC). A TIMESTAMP cannot represent the value '1970-01-01 00:00:00' because that is equivalent to 0 seconds from the epoch and the value 0 is reserved for representing '0000-00-00 00:00:00', the “zero” TIMESTAMP value.

                      Kommentar


                      • #12
                        Je geht einfach nicht würde ich daraus jetzt lesen...

                        Kommentar


                        • #13
                          Zitat von cycap Beitrag anzeigen
                          Meine o.g. Variante dürfte trotzdem funktionieren.
                          Ja funktioniert auch. Wenns schnell gehen soll mach ich das auch so. (zu faul in die Doku zu schauen) Mir stellt sich bloss immer die Frage ob die nativen Funktionen nicht doch effizienter arbeiten.

                          *edit* @nikosch das bezieht sich glaub ich auf das interne handling der Datenbank.

                          Kommentar


                          • #14
                            Naja, gibts denn ne native Variante?

                            Und irgendwie kapier ich die Aussagen des Manuals trotzdem nicht. Das müßte doch gerade mit TIMESTAMP funktionieren:

                            DATE: A three-byte integer packed as DD + MM×32 + YYYY×16×32
                            TIME: A three-byte integer packed as DD×24×3600 + HH×3600 + MM×60 + SS
                            DATETIME: Eight bytes:
                            A four-byte integer packed as YYYY×10000 + MM×100 + DD
                            A four-byte integer packed as HH×10000 + MM×100 + SS
                            TIMESTAMP: A four-byte integer representing seconds UTC since the epoch ('1970-01-01 00:00:00' UTC)

                            Kommentar


                            • #15
                              Also ich hab jetzt mal versucht das 1970-01-01 00:00:00 in ein TIMESTAMP-Feld zu schreiben und MySQL sagt mir dazu
                              Warning: #1264 Out of range value adjusted for column 'eins' at row 1
                              und schreibt 0000-00-00 00:00:00 in den Datensatz. Es gibt also kein Offset sondern es geht einfach nicht.

                              Kommentar

                              Lädt...
                              X