Bruno: Timestamp des kompletten Vorjahres

Hi,

ich benötige in einer "where-Klausel" einen Ausdruck, den ich mir per php-Script schon erstellt habe, mich aber frage, ob mysql das nicht von Hause aus mitbringt. Aber ich finde es in der Doku nicht.

Wie also drücke ich am besten:

... WHERE FROM_UNIXTIME(mytimestampspalte) = "Zeitstempelbereich des kompletten Vorjahres"

aus?

Mir fehlt eine kurze Syntax für den Ausdruck "Zeitstempelbereich des kompletten Vorjahres".

Und ja, ich weiß, dass ich statt des Zeitstempels lieber ein mysql-datum in der tabelle vorhalten sollte. Ist aber nicht meine, daher habe ich keinen direkten Einfluss darauf.

Frohes Neues, Bruno

  1. Hi!

    Wie also drücke ich am besten:
    ... WHERE FROM_UNIXTIME(mytimestampspalte) = "Zeitstempelbereich des kompletten Vorjahres"
    aus?

    Eine Bereichsangabe besteht immer aus zwei Werten, dem Anfangswert und dem Endwert. Du kannst also nicht nur einen Vergleich machen. Aber anstatt zu prüfen, ob ein Wert größer (oder gleich) dem Anfangswert und kleiner (oder gleich) dem Endwert ist, kannst du den BETWEEN...AND...-Operator verwenden.

    Beachte auch, dass der Unix-Timestamp vom 1.1.1970 _UTC_ aus zählt und dass du da gegebenenfalls Umrechnungen zur lokalen Zeit berücksichtigen musst. Prüfe also auch Werte eine Stunde vor und nach dem Jahreswechsel, ob diese ein von dir vorgesehenes Ergebnis liefern.

    Lo!

    1. Hi Dedlfix,

      hast natürlich recht. Ich hatte 2 where-klauseln anstatt between.

      Was ich suche, ist aber ein möglicht kompakte Syntax für:

      1.1.Vorjahr

      entweder in mysql-Syntax oder in php.

      Gruß nochmal, Bruno

      1. Hi!

        Was ich suche, ist aber ein möglicht kompakte Syntax für:
        1.1.Vorjahr
        entweder in mysql-Syntax oder in php.

        Lässt sich in beiden Systemen berechnen. Eine spezielle Funktion dafür gibt es nicht. Unter PHP nimmt man (gm)mktime() und für MySQL solltest du in den Date and Time Functions fündig werden.

        Lo!

  2. Hallo Bruno,

    Wie also drücke ich am besten:

    ... WHERE FROM_UNIXTIME(mytimestampspalte) = "Zeitstempelbereich des kompletten Vorjahres"

    Seh ich das richtig: du willst alle Datensätze des letzten Jahres haben, richtig? Warum dann so kompliziert, was spricht gegen:

    ... WHERE FROM_UNIXTIME(mytimestampspalte, '%Y') = YEAR(NOW())-1

    Gruß,
    Tobias

    1. Hallo Tobias,

      ... WHERE FROM_UNIXTIME(mytimestampspalte) = "Zeitstempelbereich des kompletten Vorjahres"

      Seh ich das richtig: du willst alle Datensätze des letzten Jahres haben, richtig? Warum dann so kompliziert, was spricht gegen:

      ... WHERE FROM_UNIXTIME(mytimestampspalte, '%Y') = YEAR(NOW())-1

      gegen beides spricht, dass ein vorhandener Index auf der Timestampspalte nicht genutzt werden kann. Unter diesem Gesichtspunkt wäre

      ... WHERE mytimestampspalte BETWEEN <startwert> AND <endwert>

      vorzuziehen.

      Freundliche Grüße

      Vinzenz

      1. Hi!

        Seh ich das richtig: du willst alle Datensätze des letzten Jahres haben, richtig? Warum dann so kompliziert, was spricht gegen:
        ... WHERE FROM_UNIXTIME(mytimestampspalte, '%Y') = YEAR(NOW())-1
        gegen beides spricht, dass ein vorhandener Index auf der Timestampspalte nicht genutzt werden kann. Unter diesem Gesichtspunkt wäre
        ... WHERE mytimestampspalte BETWEEN <startwert> AND <endwert>
        vorzuziehen.

        Dazu müsste es aber einer der MySQL-Date/Time-Typen sein und nicht nur ein Integer, der einen Unix-Timestamp darstellt. Alternativ müssten Start- und Endwert ebenfalls als Integer/Unix-Timestamp angegeben werden. Wenn sich das nicht so vereinheitlichen lässt, wäre es zumindest aus Index-Gesichtspunkten sinnvoll, Formeln und Funktionsaufrufe auf konstante Werte zu legen, dann müssen diese Ergebnisse nur einmalig berechnet werden. Legt man sie auf einen Spaltennamen, muss der Ausdruck für jeden Wert neu berechnet werden und ein Index scheidet dann ganz aus. (Eine Ausnahme wären hier funktionale Indexe, die MySQL aber nicht kennt.)

        Und - hier bin ich mir allerdings nicht sicher - die Cardinalität dürfte auch noch eine Rolle spielen. Wenn im Index viele verschiedene Werte stehen (sekundenfein aufgelöste Zeitwerte statt nur das Datum), dann dürfte sich eine Indexsuche gegenüber einem Full-Table-Scan nicht viel nehmen. Wenn ich hier richtig liege, und die Uhrzeit keine Rolle spielt, wäre es günstiger, eine DATE-Spalte zu verwenden. Wenn es beim Timestamp bleiben soll, dann wäre es wenigstens angebracht den Zeit-Teil auf 00:00:00 zu setzen.

        Der Vorteil des Index wäre lediglich, dass die Werte in ihm schon sortiert liegen, also ein zusammenhängender Bereich sich leichter finden lässt. Wenn ich richtig schlussfolgere, ist bei einer Bereichssuche die Kardinalität des Index weniger bedeutend als die Suche nach einzelnen Werten.

        Lo!