Overpass: Datum bzw. Stringvergleich

Nach nun 2 Stunden hat mich der Ergeiz verlassen und ich frage nun wieder einmal die Spezialisten.

Es gibt den Tag check_date. Er sollte ein Datum enthalten. Wie kann ich nun die Differenz zu einem Vergleichsdatum bilden bzw wie kann ich Objekte finden deren check_date Datum vor einem bestimmten Datum liegt?

:confused:

Vielleicht hilft dir dieses Beispiel: https://wiki.openstreetmap.org/wiki/DE:Overpass_API/Beispielsammlung#alternative_mit_.C3.9Cberpr.C3.BCfung_der_Leerungszeiten oder dieser Thread https://forum.openstreetmap.org/viewtopic.php?id=70698 Im Grunde müssten diese Abfragen in die gewünschte Richtung gehen und entsprechend anpassbar sein.

[out:xml][timeout:25];
// gather results
(
  
nwr[~"check"~"."](if: timestamp() < "2020-08-01T00:00:00Z" )({{bbox}});
  );
// print results
out body;
out meta;
>;
out skel qt;

Vielleicht so etwas in der Art?

Hm, die Abfragen, die ich mir angesehen habe, arbeiten entweder mit einem Stringvergleich oder mit der Funktion timestamp. Die timestamp-Funktion liefert aber das Datum der letzten Veränderung des Datensatzes. Das bedeutet aber, dass nicht das Datum im Tag check_date geprüft wird. Ich suche eine Möglichkeit mit der ich alle notes anzeigen lassen kann, bei denen das Datum, welches in check_date steht, vor einem festgelegten Datum liegt.

In etwa so:

node [check_date](if:DatumVon(check_date) < "2021-12-11")({{bbox}});

:slight_smile:

Eigentlich brauche ich nur eine Funktion “String2Date”.

Gibt es soetwas?

(if: check_date < “2021-12-11”) würde wohl den Wert des Keys ‘check_date’ als string mit “2021-12-11” vergleichen

Ist es das, was du meinst? Oder wann der Key ‘check_date’ das letzte mal geändert wurde? Muss ja nicht mir dem Wert von ‘check_date’ übereinstimmen.

Der Tag check_date wird, laut Wiki verwendet, um festzuhalten, wann die letzte VorOrtKontrolle, ob ein Objekt noch vorhanden ist, durchgeführt wurde. Wenn ich nun die Objekte besuchen möchte, die seit x Jahren nicht mehr kontrolliert wurden, muss ich die Differenz des aktuellen Datums, also heute 2021-12-11 mit dem Datum, welches in check_date steht, z.B. 2011-01-12 bilden. Das kann ich mit einem einfachen Stringvergleich nicht erreichen.

:frowning:

Wenn Du vom aktuellen Datum X Jahre abziehen kannst, dann reicht evtl. einfacher Stringvergleich.

D.h. und z.B.: timestamp() - check_date > 1 Jahr?

timestamp() in Unix-Sec umwandeln (seit 1.1.1970)

check_date in Unix-Sec umwandeln (seit 1.1.1970)

Die Frage halt: kann die Overpass-API das?

was ist mit u(…) keine Ahnung.

zu finden als “make … timestamp=u(timestamp()) …”

in https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_API_by_Example

Abschnitt: Making a Table of Object Versions

Brute force:

nwr[check_date=~/19[0-9][0-9]/]
nwr[check_date=~/20[0-1][0-9]/]

erschlägt alles: 1900 - 2019

Wenn es nur um x Jahre geht und das heutige Datum (Jahr) ist ja bekannt.

date()

Date Check and Normalizer – Overpass API/Overpass QL - OpenStreetMap Wiki

Nicht getestet, nur über Inhaltsverzeichnis der Overpass QL Seite im Wiki gefunden.

Hier ein Beispiel für Overpass Turbo (Auszug), müsste sich aber auch mit dem “if:” Filter kombinieren lassen:


convert node
  ::id=id(), 
  older365=date(t["check_date"])<date("{{date:365days}}")
;

Highlight Objects with a check_date older than X – Overpass API/Overpass API by Example - OpenStreetMap Wiki

Bingo :smiley:

Ich habe mit dem date() alles Mögliche und Unmögliche probiert. Immer ohne das gewünschte Ergebnis. Dabei habe ich natürlich dieses ominöse t nicht beachtet und weggelassen. Nachdem ich jetzt die Overpass QL nach t[ durchsucht habe, bin ich auch auf die entsprechende Beschreibung gestoßen. :sunglasses:

Danke :slight_smile:

Haste ma 'nen Link? Danke

Na klar

https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL

Tag Value and Generic Value Operators