New article "fhir date parameters", config changes for multilanguage

support, tarnslations for existing pages and articles
This commit is contained in:
2026-08-13 12:44:58 +02:00
parent d3b3be30f0
commit cac298e745
25 changed files with 1916 additions and 34 deletions
@@ -0,0 +1,93 @@
Title: Wissenschaftlicher Workflow mit dem BOOX Note Air 3 C
Slug: boox-note-scientific-workflow
Category: work
Tags: wissenschaftlicher workflow, kollaboration, literaturverwaltung
Date: 2024-01-26
Lang: de
Status: published
Vor Kurzem habe ich mir einen [ONYX BOOX Note Air 3 C](https://onyxboox.com/boox_noteair3c) zugelegt, um meinen wissenschaftlichen Workflow zu unterstützen. Ende letzten Jahres wurde mir klar, warum ich in meiner wissenschaftlichen Laufbahn nicht so recht vorankam. Ehrlich gesagt war mir ein Hauptgrund durchaus bewusst: mir fehlte die Selbstdisziplin, die für meine Forschung nötigen Quellen zu lesen. Den eigentlichen Grund dafür kannte ich aber erst seit letztem Jahr. Es stellte sich heraus, dass die meisten Quellen in digitaler Form vorlagen und ich mich einfach nicht dazu durchringen konnte, sie am Computerbildschirm zu lesen. Ein Tablet oder Smartphone waren ebenfalls keine echte Alternative, da mich die Displays einfach zu schnell ermüden.
Ein E-Book-Reader war eine mögliche Lösung. Ein Kollege arbeitet schon seit einiger Zeit mit einem Remarkable 2, was ich ebenfalls sehr interessant fand. Das Leseerlebnis mit diesem Gerät war allerdings nicht gut. Nach einiger Recherche habe ich mich für einen Boox Note Air 3 C entschieden, der mir sowohl bei der Lese- als auch bei der Notizfunktion am vielversprechendsten erschien. Dennoch war ich mir nicht sicher, ob ich mit dem Gerät einen sinnvollen Workflow für wissenschaftliches Arbeiten in meinem Arbeitsalltag etablieren könnte.
Nach ein paar Wochen Nutzung kann ich sagen: Der Note Air 3 C erfüllt meine Erwartungen voll und ganz. Meine Hauptanwendungsfälle bisher waren das Lesen von Lehrbüchern inklusive direkter Annotation im PDF sowie allgemeine Notizen. In den ersten Tagen habe ich natürlich versucht, mich mit den Bordmitteln des Geräts vertraut zu machen. Ich habe probiert, mit Hilfe der BOOX-Cloud und der BOOXDrop-Funktion einen brauchbaren Workflow aufzubauen. Das erwies sich jedoch als ziemlich unübersichtlich vor allem, weil mein primäres Betriebssystem Linux ist und die Synchronisationstools nur für Windows und macOS verfügbar sind. Ich musste daher jeden Synchronisationsvorgang über den Webbrowser abwickeln.
Und obwohl es Tools wie Marcin Juszkiewiczs [onyx-send2boox](https://github.com/hrw/onyx-send2boox) gibt, wollte ich von vornherein nicht alle meine Daten durch die Cloud des Herstellers schicken. Cloud und Backup dorthin habe ich zwar noch aktiviert, mein täglicher Workflow nutzt sie aber nicht mehr.
Stattdessen habe ich mittlerweile einen Workflow etabliert, der größtenteils auf selbstgehosteten Diensten und Open-Source-Anwendungen beruht.
# Websurfen
Ich nutze seit jeher Firefox als Webbrowser auf all meinen Rechnern, und auch auf meinem Android-Smartphone war Firefox stets der Standardbrowser. Vor Kurzem bin ich auf ein iPhone umgestiegen, aber auch dafür gibt es ein mobiles Firefox für iOS (leider ohne Add-on-Unterstützung).
Es lag also nahe, Firefox auch auf dem Note Air 3 C zu installieren vor allem, um Add-ons nutzen zu können, allen voran uBlock Origin, um unnötige und im schlimmsten Fall animierte Werbung (die bei einem E-Ink-Gerät besonders auf den Akku geht) zu blockieren. Da ich Firefox auf allen Geräten einsetze, kann ich [Tabs beliebig zwischen den Geräten verschieben](https://support.mozilla.org/de/kb/tabs-von-anderen-geraten-senden), solange die Installation mit meinem Mozilla-Konto verknüpft ist. Natürlich nutze ich auch hier einen Cloud-Dienst, aber die seit Jahren ausgereifte Mozilla-Cloud erscheint mir deutlich vertrauenswürdiger als die eines chinesischen Hardwareherstellers. Und der zusätzliche Komfort, nicht nur Tabs, sondern auch Lesezeichen und Verlauf zu synchronisieren, ist einfach zu praktisch, um darauf zu verzichten.
# Lesezeichen (Read-it-later)
Lesezeichen im klassischen Sinne, also die Bookmarks im Webbrowser, habe ich immer nur für häufig besuchte Websites genutzt. Kurzfristige Merkzettel habe ich nie über Browser-Lesezeichen verwaltet dafür waren für mich schon immer Read-it-later-Apps und -Dienste zuständig.
Auch wenn mit Pocket seit einiger Zeit ein Read-it-later-Dienst in Firefox integriert ist, habe ich diesen nie genutzt. Stattdessen betreibe ich schon länger eine eigene [Wallabag](https://www.wallabag.it/)-Instanz. Dazu gibt es nicht viel zu sagen es funktioniert einfach.
Die [Wallabag-App](https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche) läuft auf dem Note Air 3 C reibungslos und erlaubt mir, jederzeit auf meine Read-it-later-Lesezeichen auf diesem Gerät zuzugreifen. Einträge werden über die Android-Freigabefunktion hinzugefügt, sodass sich Lesezeichen auch direkt aus dem Webbrowser heraus anlegen lassen.
![wallabag app auf dem BOOX Note Air 3 C]({static}/images/boox-note-air-3c-wallabag.jpg)
*wallabag app auf dem BOOX Note Air 3 C*
# Literaturverwaltung
Da ich sowohl persönlich als auch in unserer Arbeitsgruppe eine gemeinsame Bibliothek über Zotero betreibe, lag es nahe, dieses auch auf dem Note Air 3 C einzusetzen. Im Play Store gibt es leider keine auf dem Gerät funktionierende Zotero-App zumindest nicht die ganze Geschichte.
Zum einen gibt es inzwischen eine offizielle [Zotero-App](https://play.google.com/store/apps/details?id=org.zotero.android) im Beta-Stadium, die auf dem Gerät funktioniert, zum anderen läuft auch die aktuell deutlich bessere App [Zoo for Zotero](https://play.google.com/store/apps/details?id=com.mickstarify.zooforzotero). Mit der Einschränkung, dass Letztere nicht über den Play Store installiert werden kann. Eine direkte Installation per APK (die man aus einschlägigen Quellen beziehen kann) funktioniert bei mir aber bislang problemlos. Zu bedenken ist außerdem, dass das letzte Update der App aus August 2021 stammt das Fehlen automatischer Updates über den Play Store ist also ein eher geringes Risiko. Trotzdem sollte man die Entwicklung bei direkten APK-Installationen im Auge behalten und bei Bedarf manuell aktualisieren.
![Zoo for Zotero App auf dem BOOX Note Air 3 C]({static}/images/boox-note-air-3c-zoo-for-zotero.jpg)
*Zoo for Zotero App auf dem BOOX Note Air 3 C*
Die Zotero-Bibliotheken (sowohl meine persönliche als auch die Gruppenbibliothek) enthalten nicht nur wissenschaftliche Publikationen zur jeweiligen Forschung, sondern auch sonstige Fachliteratur wie Lehrbücher sowie Links zu relevanten Websites und Blogbeiträgen.
Damit ist Zotero für mich mittlerweile die Standardmethode zur Synchronisation von E-Books geworden. Ich lege für ein neues E-Book einfach einen Eintrag in Zotero anhand der ISBN an und hänge die Datei an den Eintrag an. Auf dem Note Air 3 C kann ich das E-Book (oder auch jedes wissenschaftliche Paper) direkt über die Zoo for Zotero App synchronisieren. PDFs und auch EPUBs werden direkt in der BOOX-Neo-Reader-App geöffnet, sodass Annotationen von Haus aus möglich sind.
Der einzige Nachteil: Die annotierten Dateien werden natürlich nicht direkt zurück nach Zotero synchronisiert. Bei der Gruppenbibliothek ist das andererseits vielleicht auch gar nicht so schlecht schließlich möchten nicht alle Kolleg:innen meine Annotationen in ihrer Bibliothek haben.
# Zwischenablage teilen
Gelegentlich brauche ich auch eine schnelle Möglichkeit, die Zwischenablage vom Rechner auf den Note Air 3 C zu übertragen oder umgekehrt. Da ich, wie oben erwähnt, auf allen Rechnern Linux-Desktopsysteme einsetze, ist [KDE Connect](https://apps.kde.org/de/kdeconnect/) meiner Meinung nach die beste Option. Es bietet nicht nur das Teilen der Zwischenablage, sondern auch Funktionen wie das Teilen von Benachrichtigungen oder Remote-Eingaben.
Auch wenn es KDE Connect heißt, ist es dank der [GSConnect-Erweiterung](https://extensions.gnome.org/extension/1319/gsconnect/) ebenso mit GNOME-Desktops kompatibel.
# KI-Unterstützung
Auch wenn es auf dem E-Ink-Display wegen der stark animierten Live-Ausgabe nicht besonders gut aussieht, lässt sich die [offizielle ChatGPT-App](https://play.google.com/store/apps/details?id=com.openai.chatgpt) nutzen. Ich greife allerdings nur darauf zurück, wenn ich wirklich kein anderes Gerät zur Hand habe was praktisch nie vorkommt, da ich immer mindestens ein Smartphone in der Nähe habe. Und trotz des kleineren Displays ist die Usability dort deutlich besser.
![ChatGPT App auf dem BOOX Note Air 3 C]({static}/images/boox-note-air-3c-chatgpt.jpg)
*ChatGPT App auf dem BOOX Note Air 3 C*
# Kollaboration
Da wir in unserer Arbeitsgruppe Jira und Confluence als Kollaborationstools einsetzen, nutze ich auch hier die offiziellen Apps für [Jira Data Center](https://play.google.com/store/apps/details?id=com.atlassian.jira.server) und [Confluence Data Center](https://play.google.com/store/apps/details?id=com.atlassian.confluence.server). Auch hier gilt: Ich nutze die Apps nur, wenn kein anderes Gerät zur Hand ist. Ich kann daher lediglich sagen, dass sie funktionieren und einfach zu bedienen sind, eine tiefergehende Nutzungsanalyse habe ich aber nicht durchgeführt.
# E-Mail
Wie in den vorangegangenen Absätzen vielleicht schon deutlich wurde, nutze ich den Note Air 3 C nicht wirklich als Tablet im klassischen Sinne. Trotzdem muss ich gelegentlich eine E-Mail auf dem Tablet öffnen. Ich denke, dass grundsätzlich jeder Standard-Mail-Client auf dem Gerät funktionieren sollte, der Vollständigkeit halber sei aber erwähnt, dass Marcel Bokhorsts großartiger Open-Source-Mail-Client [FairEmail](https://play.google.com/store/apps/details?id=eu.faircode.email) auf dem Gerät hervorragend läuft.
# Kalender (und Kontakte)
Kalenderzugriff (und -synchronisation) ist eine weitere Funktion, die ich nicht ständig brauche. Aber es ist hin und wieder nützlich, meinen Kalender auch auf dem Note Air 3 C einsehen zu können. Da ich meinen Kalender (auch auf anderen Geräten) über CalDAV synchronisiere (und meine Kontakte über CardDAV), nutze ich dafür einfach [DAVx⁵](https://play.google.com/store/apps/details?id=at.bitfire.davdroid) auf dem Gerät.
Da das Gerät standardmäßig keine Kalender- oder Kontakte-App mitbringt, müssen diese nachträglich installiert werden. Ich bin seit Jahren großer Fan der Apps [Simple Calendar](https://play.google.com/store/apps/details?id=com.simplemobiletools.calendar) und [Simple Contacts](https://play.google.com/store/apps/details?id=com.simplemobiletools.contacts). Der Vollständigkeit halber sei erwähnt, dass ich immer die Pro-Versionen nutze es kann also sein, dass der kostenlosen Version Funktionen fehlen oder sie andere Nachteile hat.
# Onleihe
Auch die Onleihe-App habe ich auf dem BOOX Note Air 3 C ausprobiert. Auf dem E-Ink-Display wirkt sie durch die vielen Farbelemente recht unruhig; selbst mit dem dunklen Farbschema bleiben etwa die grünen Flächen (siehe Screenshot) uneinheitlich, da das dabei verwendete Schwarz keine gleichmäßige Fläche ergibt. Zum gemütlichen Stöbern lädt das nicht gerade ein, für die schnelle Ausleihe eines E-Books oder E-Magazins reicht es aber allemal.
![Onleihe auf dem BOOX Note Air 3 C]({static}/images/boox-note-air-3c-onleihe1.jpg)
*Onleihe auf dem BOOX Note Air 3 C*
Auch das Lesen digitaler Tageszeitungen über die Onleihe-App funktioniert recht gut, wobei man wegen der Spaltenzahl entsprechend stark zoomen muss.
![Zeitungslektüre über die Onleihe App auf dem BOOX Note Air 3 C]({static}/images/boox-note-air-3c-onleihe2.jpg)
*Zeitungslektüre über die Onleihe App auf dem BOOX Note Air 3 C*
# Alternativer App-Store
[F-Droid](https://f-droid.org) lässt sich auf dem Note Air 3 C installieren nicht nur als Alternative zum Play Store, sondern auch um Open-Source-Apps installieren zu können, die möglicherweise nicht für das Gerät im Play Store freigegeben sind. Das ermöglicht zudem die Installation kostenloser Builds mancher Apps, die den vollen Funktionsumfang bieten, der sonst nur per Pro-Upgrade verfügbar wäre.
+302
View File
@@ -0,0 +1,302 @@
Title: HowTo: Der FHIR `date`-Suchparameter Präfixe, Intervalle und Kombinationen richtig verstehen
Slug: howto-fhir-date-parameter
Category: work
Tags: FHIR, howto
Date: 2026-08-12
Lang: de
Status: published
Wer FHIR-Server baut oder abfragt, stolpert früher oder später über den
`date`-Suchparameter. Auf den ersten Blick sieht er simpel aus:
`?date=2023-06-15`. Aber sobald Präfixe wie `ge`, `sa` oder `ap` ins Spiel
kommen und mehrere `date`-Parameter kombiniert werden, wird es schnell
unübersichtlich. Dieser Artikel bringt Ordnung rein: Schritt für Schritt, mit
Zeitleisten-Grafiken zu jedem Fall, und als Kurzreferenz zum schnellen
Nachschlagen.
## Inhaltsverzeichnis
[TOC]
---
## Kurzreferenz: Alle Präfixe auf einen Blick
Für den schnellen Blick zwischendurch. Details und Grafiken zu jeder Zeile
folgen in den Abschnitten unten.
| Präfix | Name | Kurzregel | Beispiel |
|---|---|---|---|
| *(keins)* | implizit `eq` | Precision des Werts bestimmt das Intervall | `date=2023-06-15` |
| `eq` | gleich | Resource-Intervall vollständig im Such-Intervall | `date=eq2023-06-15` |
| `ne` | ungleich | Komplement von `eq` | `date=ne2023-06-15` |
| `gt` | größer als | Ragt über das Ende hinaus (Overlap genügt) | `date=gt2023-06-15` |
| `lt` | kleiner als | Beginnt vor dem Anfang (Overlap genügt) | `date=lt2023-06-15` |
| `ge` | größer/gleich | `gt` oder vollständig enthalten (`eq`) | `date=ge2023-06-15` |
| `le` | kleiner/gleich | `lt` oder vollständig enthalten (`eq`) | `date=le2023-06-15` |
| `sa` | starts after | Vollständig danach, **keine** Überlappung | `date=sa2023-06-15` |
| `eb` | ends before | Vollständig davor, **keine** Überlappung | `date=eb2023-06-15` |
| `ap` | approximately | Überlappung + ähnliche Größenordnung | `date=ap2023-06-15` |
**Fehlender `start`/`end` bei `Period`:** fehlender `start` bedeutet `-∞`,
fehlendes `end` bedeutet `+∞`. Deshalb kann `sa` bei fehlendem `start` nie
matchen, und `eb` kann bei fehlendem `end` nie matchen (Details in
[Abschnitt 4](#4-offene-unvollständige-periods)).
---
## Das Grundprinzip: FHIR vergleicht Intervalle, keine Zeitpunkte
Der wichtigste gedankliche Reset zuerst: FHIR behandelt Datumswerte nie als
exakten Zeitpunkt, sondern immer als **Intervall**. Wie breit dieses Intervall
ist, hängt von der Precision des angegebenen Werts ab:
- `2023` → das ganze Jahr 2023
- `2023-06` → der ganze Juni 2023
- `2023-06-15` → der ganze 15. Juni 2023 (00:0024:00 Uhr)
- `2023-06-15T10:00:00` → (fast) ein exakter Zeitpunkt
Jeder Vergleichsoperator vergleicht anschließend **zwei Intervalle**
miteinander: das Such-Intervall aus deinem Query-Parameter und das
Resource-Intervall aus dem Feld der Ressource (z. B. `Patient.birthDate` oder
`Encounter.period`).
### Ohne Präfix = `eq`, aber die Precision entscheidet mit
Gibst du kein Präfix an, nimmt der Server `eq` an. Das Resource-Datum muss
dann **vollständig** innerhalb deines Such-Intervalls liegen. Je gröber die
Precision, desto breiter das Intervall, und desto mehr Resource-Werte passen
hinein:
![Datum ohne Präfix]({static}/images/fhir-date-no-prefix_de.svg)
*FHIR date-Suchparameter OHNE Präfix*
`date=2023-06-15` matched nur diesen einen Tag. `date=2023-06` matched dagegen
jeden Tag im Juni, auch den 15. Das ist der häufigste Stolperstein für
Einsteiger: eine „ungenaue" Suchanfrage ist nicht strenger, sondern lockerer.
---
## Die neun Präfixe im Überblick
FHIR definiert insgesamt neun Präfixe für `date`. Jeder davon beschreibt eine
andere Beziehung zwischen Such-Intervall (rot gestrichelt in der Grafik) und
Treffer-Bereich (grün/farbig schattiert):
![Alle Präfixe im Überblick]({static}/images/fhir-date-all-prefixes_de.svg)
*Alle Präfixe im Überblick*
| Präfix | Name | Bedeutung |
|---|---|---|
| `eq` | gleich | Resource-Intervall liegt vollständig im Such-Intervall |
| `ne` | ungleich | Komplement von `eq` |
| `gt` | größer als | Resource-Intervall **ragt über** das Ende des Such-Intervalls hinaus |
| `lt` | kleiner als | Resource-Intervall **beginnt vor** dem Anfang des Such-Intervalls |
| `ge` | größer/gleich | `gt` **oder** vollständig im Such-Intervall enthalten (`eq`) |
| `le` | kleiner/gleich | `lt` **oder** vollständig im Such-Intervall enthalten (`eq`) |
| `sa` | starts after | Beginnt vollständig **nach** dem Ende des Such-Intervalls, keine Überlappung |
| `eb` | ends before | Endet vollständig **vor** dem Beginn des Such-Intervalls, keine Überlappung |
| `ap` | approximately | Überlappung, plus ähnliche Größenordnung der Intervalle |
**Wichtig, Containment vs. Overlap:** Nur `eq` (und implizit `sa`/`eb`)
verlangen, dass das Resource-Intervall **vollständig** innerhalb bzw.
**vollständig getrennt** vom Such-Intervall liegt. Bei `gt`, `lt`, `ge`
und `le` reicht dagegen eine **Überlappung**: das Resource-Intervall muss
nicht komplett außerhalb des Suchbereichs liegen, es genügt, dass es über
die jeweilige Grenze hinausragt. Details dazu im nächsten Abschnitt.
---
## Matching gegen `Period` und `Range`
Die Grafiken oben zeigen das Resource-Datum als schmalen roten Marker. Das
passt für einfache `date`/`dateTime`-Felder wie `Patient.birthDate`. Sobald
das Zielfeld selbst ein **Intervall** ist (`Period`, z. B.
`Encounter.period`, `Condition.onsetPeriod`, oder `Range`), wird die
Unterscheidung zwischen **Containment** (vollständiges Enthaltensein) und
**Overlap** (bloße Überlappung) entscheidend:
- **`eq`** verlangt Containment: das gesamte Resource-Intervall muss im
Such-Intervall liegen.
- **`gt` / `lt` / `ge` / `le`** verlangen nur Overlap: es reicht, wenn das
Resource-Intervall über die jeweilige Grenze hinausragt, auch wenn ein
Teil davon auf der "falschen" Seite liegt.
- **`sa` / `eb`** verlangen das Gegenteil von Overlap: das Resource-Intervall
muss vollständig und ohne jede Überlappung auf der jeweiligen Seite liegen.
Bei einem einfachen Zeitpunkt-Feld (kein `Period`) fällt dieser Unterschied
praktisch nicht auf, da Resource-Start und -Ende (fast) identisch sind. Dort
verhalten sich `gt` und `sa` de facto gleich. Der Unterschied wird erst bei
echten Zeitspannen relevant. Das ist auch der Grund, warum `sa`/`eb`
laut Spezifikation in erster Linie für `Period`/`Range`-Werte gedacht sind.
**Beispiel:** Ein Encounter läuft vom 10. bis 20. Juni. Die Suche
`date=gt2023-06-15` soll ihn finden, obwohl der Encounter *vor* dem 15.
begonnen hat. Entscheidend ist nur, dass er über den 15. hinausreicht
(Overlap mit dem Bereich "nach dem 15."). Bei `date=sa2023-06-15` würde
derselbe Encounter dagegen **nicht** matchen, weil er nicht vollständig nach
dem 15. liegt. Genau das ist der praktische Unterschied zwischen `gt` und
`sa`.
Die folgende Grafik macht das für alle vier "einseitigen" Präfixe (`gt`,
`sa`, `lt`, `eb`) an denselben drei Beispiel-Periods sichtbar: einer
Period komplett davor, einer, die die Suchgrenze überlappt, und einer
komplett danach:
![Matching gegen Period/Range]({static}/images/fhir-date-period-range-matching_de.svg)
*Matching gegen Period/Range (Containment vs. Overlap)*
Man sieht deutlich: `gt` und `lt` (blau schattierter Bereich, durchgezogene
Grenzlinie) lassen die überlappende Period B als Treffer durch, während `sa`
und `eb` (gestrichelte Grenzlinie) sie ablehnen. Nur eine Period, die
komplett auf der richtigen Seite liegt, zählt dort.
| Encounter-Zeitraum | `date=gt2023-06-15` | `date=sa2023-06-15` |
|---|---|---|
| 10.20. Juni (überlappt die Grenze) | ✅ Treffer (Overlap) | ❌ kein Treffer (nicht vollständig danach) |
| 16.20. Juni (komplett danach) | ✅ Treffer | ✅ Treffer |
| 01.10. Juni (komplett davor) | ❌ kein Treffer | ❌ kein Treffer |
---
## Offene (unvollständige) Periods
In der Praxis sind Periods oft **nicht abgeschlossen**, zum Beispiel ein
laufender Encounter ohne `end`, oder ein importierter Datensatz mit
unbekanntem `start`. Der FHIR-Standard regelt das eindeutig:
> Ein fehlender unterer Rand (`start`) gilt implizit als **kleiner als jedes
> reale Datum** (also `-∞`). Ein fehlender oberer Rand (`end`) gilt implizit
> als **größer als jedes reale Datum** (also `+∞`).
Das hat spürbare Konsequenzen, gerade für `sa` und `eb`:
- Ein laufender Encounter (`start` gesetzt, `end` fehlt, also `end = +∞`)
kann **niemals** `eb` (ends before) matchen. Sein Ende liegt ja nie vor
irgendeinem endlichen Datum. Er matcht aber sehr wohl `gt`, weil sein
(unendliches) Ende immer über jede Suchgrenze hinausragt.
- Ein Encounter mit unbekanntem Start (`start` fehlt, also `start = -∞`)
kann **niemals** `sa` (starts after) matchen. Sein Beginn liegt ja nie
nach irgendeinem endlichen Datum. Er matcht aber `lt`, weil sein
(unendlicher) Anfang immer vor jede Suchgrenze hineinreicht.
- Eine Period ganz ohne `start` und `end` überlappt praktisch **jeden**
overlap-basierten Filter (`gt`, `lt`, `ge`, `le`). Sie „reicht" ja per
Definition über jede Grenze hinaus.
Dieselben vier Präfixe wie in [Abschnitt 3](#3-matching-gegen-period-und-range),
jetzt mit offenen statt geschlossenen Periods:
![Matching gegen offene Period/Range]({static}/images/fhir-date-open-periods_de.svg)
*Matching gegen offene (unvollständige) Period/Range*
**Praktische Konsequenz:** Wenn du „laufende" Ressourcen (z. B. aktive
Encounter, offene Verordnungen) gezielt aus einer Zeitraumsuche ausschließen
willst, reicht `eb`/`sa` allein nicht. Du musst zusätzlich nach dem Status
oder explizit nach `end:missing=true`/`start:missing=true` filtern, je
nachdem, was dein Server unterstützt.
---
## Mehrere `date`-Parameter kombinieren
In der Praxis reicht ein einzelner Präfix selten, meist willst du einen
**Bereich** definieren. FHIR-Server verknüpfen mehrere `date`-Parameter in
derselben Query immer per **UND**. Vier typische Muster:
![Kombination mehrerer Parameter]({static}/images/fhir-date-combinations_de.svg)
*Kombination mehrerer Parameter (UND-Verknüpfung)*
| Kombination | Beispiel | Charakter |
|---|---|---|
| `ge` + `le` | `ge2023-01-01&le2023-12-31` | Geschlossenes Intervall (beide Grenzen inklusive) |
| `gt` + `lt` | `gt2023-01-01&lt2023-12-31` | Offenes Intervall (beide Grenzen exklusive) |
| `sa` + `eb` | `sa2023-01-01&eb2023-12-31` | Strikt getrennter Bereich, primär für Period-Werte |
| `ge` + `lt` | `ge2023-06-01&lt2023-07-01` | Halboffenes Intervall `[start, ende)`, Standardmuster für „genau ein Monat" |
Wenn du in Timestamp-lastigen ETL-Pipelines mit `[start, ende)` arbeitest,
kommt dir `ge` + `lt` bekannt vor: es ist exakt dasselbe Muster wie bei
klassischen Zeitfenster-Queries in SQL.
---
## Die vollständige 3×3-Matrix aller Bereichs-Kombinationen
Die vier Muster oben sind nur die gebräuchlichsten. Tatsächlich lässt sich
**jede** Untergrenze mit **jeder** Obergrenze kombinieren:
- Untergrenzen: `ge`, `gt`, `sa`
- Obergrenzen: `le`, `lt`, `eb`
Das ergibt 3 × 3 = **9 mögliche Kombinationen**, alle spec-konform:
![3x3-Matrix der Bereichs-Kombinationen]({static}/images/fhir-date-matrix-3x3_de.svg)
*3x3-Matrix der Bereichs-Kombinationen (Untergrenze x Obergrenze)*
Sie unterscheiden sich nur darin, ob die jeweilige Grenze inklusiv
(durchgezogene Linie) oder exklusiv (gestrichelte Linie) ist, und ob es sich
um einen einfachen Werte-Vergleich (`ge`/`gt`/`le`/`lt`) oder einen strengen
Period-Vergleich (`sa`/`eb`) handelt. Es gibt **keine explizite
Ausschluss-Regel** im FHIR-Standard. Jede Zelle dieser Matrix ist eine
gültige, funktionierende Query.
---
## Sonderfälle: Wenn Kombinationen redundant oder widersprüchlich werden
Nicht jede syntaktisch gültige Kombination ist auch praktisch sinnvoll. Drei
Kategorien solltest du kennen, bevor du sie versehentlich in einer
generierten Query landen lässt:
![Sonderfälle bei Parameter-Kombinationen]({static}/images/fhir-date-edge-cases_de.svg)
*Sonderfälle bei Parameter-Kombinationen*
### Redundante Kombinationen
Ändern nichts am Ergebnis, sind aber technisch kein Fehler:
- `eq` + eine Grenze, die vom `eq`-Intervall ohnehin erfüllt wird
(`eq2023-06-15&ge2020-01-01`): die Zusatzbedingung ist überflüssig.
- Zwei Bedingungen desselben Richtungstyps
(`ge2020-01-01&ge2023-01-01`): nur die strengere (spätere) Untergrenze
wirkt effektiv.
### Kombinationen mit garantiert leerem Ergebnis
Strukturell unmöglich zu erfüllen:
- `eq` + `ne` auf denselben Wert (`eq2023-06-15&ne2023-06-15`): sich
gegenseitig ausschließende Bedingungen.
- Untergrenze liegt zeitlich nach der Obergrenze
(`ge2023-06-01&le2023-01-01`): kein Datum erfüllt beides gleichzeitig.
Der Server wird solche Queries **syntaktisch akzeptieren** und einfach eine
leere Ergebnismenge zurückgeben. Kein Fehler, aber auch keine hilfreiche
Rückmeldung. Es lohnt sich, so etwas clientseitig vorab zu validieren.
### Ungewöhnliche, aber gültige Sonderfälle
- **Drei oder mehr `date`-Parameter**, z. B. ein Jahresbereich mit
ausgeschlossenem Einzeltag: `ge2023-01-01&le2023-12-31&ne2023-06-15`.
- **`ap` kombiniert mit einer Grenze**, z. B.
`ap2023-06-15&ge2023-01-01`: selten genutzt, da `ap` selbst schon
unscharf ist und die Toleranzberechnung serverabhängig bleibt.
---
## Praxis-Empfehlungen zum Schluss
- Für einfache Bereichsfilter ist **`ge` + `lt`** (halboffenes Intervall) meist
das robusteste Muster: es vermeidet Rundungsprobleme an der
Precision-Grenze (kein Off-by-one bei „bis einschließlich 31.12.").
- **`sa`/`eb`** bewusst einsetzen, wenn du bei `Period`/`Range`-Feldern eine
*vollständige* Trennung brauchst (siehe [Abschnitt 3](#3-matching-gegen-period-und-range)),
z. B. „Encounter vollständig nach Entlassung X". Für einen simplen
„ab Datum X"-Filter ist meist `ge`/`gt` gemeint, nicht `sa`.
- Bei `Period`-Feldern mit möglichen offenen Enden (siehe
[Abschnitt 4](#4-offene-unvollständige-periods)) nicht vergessen: `sa`/`eb`
greifen dort strukturell nie. Ggf. zusätzlich `:missing` oder Status
filtern.
- Vor dem Absetzen einer Multi-Parameter-Query lohnt sich ein kurzer Check auf
logische Konsistenz zwischen Unter- und Obergrenze, um leere Ergebnisse
durch Konfigurationsfehler in der eigenen Pipeline zu vermeiden.
Mit der Kurzreferenz oben und den sechs Grafiken im Hinterkopf, ohne Präfix,
alle neun Präfixe einzeln, Containment vs. Overlap bei Period/Range (offen
wie geschlossen), typische Kombinationen, die volle 3×3-Matrix und die
Sonderfälle, sollte die nächste `date`-Query im FHIR-Suchparameter kein
Rätsel mehr sein.
@@ -1,7 +1,9 @@
Title: Scientific workflow with BOOX Note Air 3 C
Slug: boox-note-scientific-workflow
Category: work
Tags: scientific workflow, collaboration, literature management
Date: 2024-01-26
Lang: en
Status: published
Recently I bought an [ONYX BOOX Note Air 3 C](https://onyxboox.com/boox_noteair3c) to support my scientific workflow. In the end of last year I realized why I wasn't moving forward in my scientifc career. To be honest I was very well aware of one main reason, which was that I hadn't enough self-discipline to read the sources needed for my research, but I didn't know the reason for it until last year. It turned out that the main reason was that most of the sources were in digital form and I couldn't bring myself to read them on the computer monitor. A tablet or smartphone weren't viable alternatives either, as the displays simply tire me out too quickly.
@@ -30,7 +32,7 @@ Even though a read-it-later service has been integrated into Firefox for some ti
The [wallbag app](https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche) runs smoothly on the Note Air 3 C and allows me to call up my read-it-later bookmarks on this device at any time. Adding entries to the app is done via the Android sharing function and therefore also allows bookmarks to be added directly from the web browser.
![wallabag app on BOOX Note Air 3 C](./images/boox-note-air-3c-wallabag.jpg)
![wallabag app on BOOX Note Air 3 C]({static}/images/boox-note-air-3c-wallabag.jpg)
*wallabag app on BOOX Note Air 3 C*
# Literature management
@@ -39,7 +41,7 @@ Since I personally and we in our scientific working group operate a shared libra
On the one hand, there is now an official [Zotero app](https://play.google.com/store/apps/details?id=org.zotero.android) in the beta phase that works on the device and, on the other hand, the currently much better app [Zoo for Zotero](https://play.google.com/store/apps/details?id=com.mickstarify.zooforzotero) also works. With the caveat that the latter cannot be installed from the Play Store. But a direct installation via APK (which can be obtained from relevant sources) is possible and has run without any problems for me so far. In addition, the last update of the app is from August 2021, so the lack of an automatic update by the Play Store is also a minor risk. Nevertheless, you should of course keep an eye on the development of direct APK installations and carry out a manual update if necessary.
![Zoo for Zotero app on BOOX Note Air 3 C](./images/boox-note-air-3c-zoo-for-zotero.jpg)
![Zoo for Zotero app on BOOX Note Air 3 C]({static}/images/boox-note-air-3c-zoo-for-zotero.jpg)
*Zoo for Zotero app on BOOX Note Air 3 C*
The Zotero libraries (both my personal and the group library) contain not only scientific publications relevant to the respective research, but also other specialized literature such as textbooks and links to relevant websites and blog posts.
@@ -58,7 +60,7 @@ Even though it is called KDE Connect, it is also compatible with GNOME desktops
Even if it doesn't look particularly good on the e-ink display due to the heavily animated live output, the [official ChatGPT app](https://play.google.com/store/apps/details?id=com.openai.chatgpt) can be used. But I only use it when I really don't have any other device to hand, which is never the case as I always have at least one smartphone nearby. And despite the smaller display, the usability is far better here.
![ChatGPT app on BOOX Note Air 3 C](./images/boox-note-air-3c-chatgpt.jpg)
![ChatGPT app on BOOX Note Air 3 C]({static}/images/boox-note-air-3c-chatgpt.jpg)
*ChatGPT app on BOOX Note Air 3 C*
# Collaboration
@@ -79,14 +81,15 @@ As the device does not come with a calendar or contacts app as standard, these h
As I live in Germany, I was particularly interested in whether and how well the [Onleihe app](https://play.google.com/store/apps/details?id=de.etecture.ekz.onleihe) for german public libraries works on the BOOX Note Air 3 C. What can I say? What can I say, it works, but the app looks very restless on the E-Ink display due to the many color representations. Although you can also change the color scheme to a dark standard theme, the green areas (visible in the screenshot below) still look very uneven, as the black used then does not form a uniform color area. Therefore, it doesn't really invite you to browse, but it's enough to quickly borrow an e-book or an e-magazine.
![Onleihe on BOOX Note Air 3 C](./images/boox-note-air-3c-onleihe1.jpg)
![Onleihe on BOOX Note Air 3 C]({static}/images/boox-note-air-3c-onleihe1.jpg)
*Onleihe on BOOX Note Air 3 C*
Also reading electronic newspaper via the Onleihe App works quite well. Of course, you need to zoom quite a lot to compensate for the number of columns in a daily newspaper.
![Reading newspaper via Onleihe app on BOOX Note Air 3 C](./images/boox-note-air-3c-onleihe2.jpg)
![Reading newspaper via Onleihe app on BOOX Note Air 3 C]({static}/images/boox-note-air-3c-onleihe2.jpg)
*Reading newspaper via Onleihe app on BOOX Note Air 3 C*
# Alternative app store
[F-Droid](https://f-droid.org) can be installed on the Note Air 3 C not only to have an alternative to the Play Store, but also to be able to install open source apps that may not have been released for the device in the Play Store. This also allows the installation of free builds for some apps, which offer the full range of functions that would otherwise only be available via a Pro upgrade.
+300
View File
@@ -0,0 +1,300 @@
Title: HowTo: The FHIR `date` Search Parameter Understanding Prefixes, Intervals, and Combinations
Slug: howto-fhir-date-parameter
Category: work
Tags: FHIR, howto
Date: 2026-08-12
Lang: en
Status: published
Anyone building or querying a FHIR server sooner or later runs into the
`date` search parameter. At first glance it looks simple:
`?date=2023-06-15`. But as soon as prefixes like `ge`, `sa`, or `ap` come
into play, and multiple `date` parameters get combined, things get
confusing fast. This article brings order to the chaos: step by step, with
timeline graphics for every case, and a quick-reference table for fast
lookups.
## Table of Contents
[TOC]
---
## Quick Reference: All Prefixes at a Glance
For a fast glance in between. Details and graphics for every row follow in
the sections below.
| Prefix | Name | Short rule | Example |
|---|---|---|---|
| *(none)* | implicit `eq` | Precision of the value determines the interval | `date=2023-06-15` |
| `eq` | equal to | Resource interval fully within the search interval | `date=eq2023-06-15` |
| `ne` | not equal to | Complement of `eq` | `date=ne2023-06-15` |
| `gt` | greater than | Extends beyond the end (overlap is sufficient) | `date=gt2023-06-15` |
| `lt` | less than | Begins before the start (overlap is sufficient) | `date=lt2023-06-15` |
| `ge` | greater or equal | `gt` or fully contained (`eq`) | `date=ge2023-06-15` |
| `le` | less or equal | `lt` or fully contained (`eq`) | `date=le2023-06-15` |
| `sa` | starts after | Entirely after, **no** overlap | `date=sa2023-06-15` |
| `eb` | ends before | Entirely before, **no** overlap | `date=eb2023-06-15` |
| `ap` | approximately | Overlap + similar order of magnitude | `date=ap2023-06-15` |
**Missing `start`/`end` on a `Period`:** a missing `start` means `-∞`, a
missing `end` means `+∞`. That's why `sa` can never match when `start` is
missing, and `eb` can never match when `end` is missing (details in
[Section 4](#4-open-incomplete-periods)).
---
## The Core Principle: FHIR Compares Intervals, Not Points in Time
The most important mental reset first: FHIR never treats date values as an
exact point in time. It always treats them as an **interval**. How wide
that interval is depends on the precision of the given value:
- `2023` → the entire year 2023
- `2023-06` → all of June 2023
- `2023-06-15` → all of June 15, 2023 (00:0024:00)
- `2023-06-15T10:00:00` → (almost) an exact point in time
Every comparison operator then compares **two intervals** with each other:
the search interval from your query parameter, and the resource interval
from the resource's field (e.g. `Patient.birthDate` or
`Encounter.period`).
### No prefix means `eq`, but precision still matters
If you don't specify a prefix, the server assumes `eq`. The resource date
must then lie **fully** within your search interval. The coarser the
precision, the wider the interval, and the more resource values fit
inside it:
![Date without a prefix]({static}/images/fhir-date-no-prefix_en.svg)
*FHIR date search parameter WITHOUT a prefix*
`date=2023-06-15` only matches this single day. `date=2023-06`, on the
other hand, matches every day in June, including the 15th. That's the
most common trap for beginners: a "less precise" search query isn't
stricter, it's looser.
---
## The Nine Prefixes at a Glance
FHIR defines nine prefixes for `date` in total. Each describes a different
relationship between the search interval (red dashed in the graphic) and
the matching range (colored/shaded):
![All prefixes at a glance]({static}/images/fhir-date-all-prefixes_en.svg)
*All prefixes at a glance*
| Prefix | Name | Meaning |
|---|---|---|
| `eq` | equal to | Resource interval lies fully within the search interval |
| `ne` | not equal to | Complement of `eq` |
| `gt` | greater than | Resource interval **extends beyond** the end of the search interval |
| `lt` | less than | Resource interval **begins before** the start of the search interval |
| `ge` | greater or equal | `gt` **or** fully contained within the search interval (`eq`) |
| `le` | less or equal | `lt` **or** fully contained within the search interval (`eq`) |
| `sa` | starts after | Begins entirely **after** the end of the search interval, no overlap |
| `eb` | ends before | Ends entirely **before** the start of the search interval, no overlap |
| `ap` | approximately | Overlap, plus a similar order of magnitude between the intervals |
**Important, containment vs. overlap:** Only `eq` (and, implicitly,
`sa`/`eb`) require the resource interval to lie **fully** within, or
**fully separated** from, the search interval. For `gt`, `lt`, `ge`, and
`le`, an **overlap** is enough: the resource interval doesn't have to lie
completely outside the search range, it just needs to extend past the
respective boundary. More on that in the next section.
---
## Matching Against `Period` and `Range`
The graphics above show the resource date as a thin red marker. That
works for simple `date`/`dateTime` fields like `Patient.birthDate`. As
soon as the target field is itself an **interval** (a `Period`, e.g.
`Encounter.period`, `Condition.onsetPeriod`, or a `Range`), the
distinction between **containment** (fully contained) and **overlap**
(mere overlap) becomes crucial:
- **`eq`** requires containment: the entire resource interval must lie
within the search interval.
- **`gt` / `lt` / `ge` / `le`** only require overlap: it's enough for the
resource interval to extend past the respective boundary, even if part
of it lies on the "wrong" side.
- **`sa` / `eb`** require the opposite of overlap: the resource interval
must lie fully, and without any overlap, on the respective side.
For a simple point-in-time field (no `Period`), this distinction barely
shows, since the resource's start and end are (almost) identical. There,
`gt` and `sa` behave de facto the same. The difference only becomes
relevant for actual time spans. That's also why `sa`/`eb` are, per the
specification, primarily intended for `Period`/`Range` values.
**Example:** An encounter runs from June 10 to June 20. The search
`date=gt2023-06-15` should find it, even though the encounter *started*
before the 15th. What matters is only that it extends past the 15th
(overlap with the range "after the 15th"). With `date=sa2023-06-15`, the
same encounter would **not** match, because it doesn't lie entirely after
the 15th. That's exactly the practical difference between `gt` and `sa`.
The following graphic makes this visible for all four "one-sided" prefixes
(`gt`, `sa`, `lt`, `eb`) using the same three example periods: one
entirely before, one overlapping the boundary, and one entirely after:
![Matching against Period/Range]({static}/images/fhir-date-period-range-matching_en.svg)
*Matching against Period/Range (containment vs. overlap)*
You can clearly see: `gt` and `lt` (blue shaded area, solid boundary line)
let the overlapping Period B through as a match, while `sa` and `eb`
(dashed boundary line) reject it. Only a period lying entirely on the
correct side counts there.
| Encounter timeframe | `date=gt2023-06-15` | `date=sa2023-06-15` |
|---|---|---|
| June 1020 (overlaps the boundary) | ✅ Match (overlap) | ❌ No match (not entirely after) |
| June 1620 (entirely after) | ✅ Match | ✅ Match |
| June 110 (entirely before) | ❌ No match | ❌ No match |
---
## Open (Incomplete) Periods
In practice, periods are often **not closed**, for example an ongoing
encounter without an `end`, or an imported record with an unknown
`start`. The FHIR standard handles this clearly:
> A missing lower bound (`start`) is implicitly treated as **less than any
> real date** (i.e. `-∞`). A missing upper bound (`end`) is implicitly
> treated as **greater than any real date** (i.e. `+∞`).
This has noticeable consequences, especially for `sa` and `eb`:
- An ongoing encounter (`start` set, `end` missing, so `end = +∞`) can
**never** match `eb` (ends before). Its end never lies before any
finite date. It will, however, match `gt`, because its (infinite) end
always extends beyond any search boundary.
- An encounter with an unknown start (`start` missing, so `start = -∞`)
can **never** match `sa` (starts after). Its beginning never lies after
any finite date. It will, however, match `lt`, because its (infinite)
beginning always reaches before any search boundary.
- A period with neither `start` nor `end` overlaps practically **every**
overlap-based filter (`gt`, `lt`, `ge`, `le`). By definition, it
"extends" past every boundary.
The same four prefixes as in [Section 3](#3-matching-against-period-and-range),
now with open instead of closed periods:
![Matching against open Period/Range]({static}/images/fhir-date-open-periods_en.svg)
*Matching against open (incomplete) Period/Range*
**Practical consequence:** If you want to specifically exclude "ongoing"
resources (e.g. active encounters, open orders) from a date-range search,
`eb`/`sa` alone won't do it. You'll additionally need to filter by status,
or explicitly by `end:missing=true`/`start:missing=true`, depending on
what your server supports.
---
## Combining Multiple `date` Parameters
In practice, a single prefix is rarely enough. Usually you want to define
a **range**. FHIR servers always combine multiple `date` parameters in the
same query with **AND**. Four typical patterns:
![Combining multiple parameters]({static}/images/fhir-date-combinations_en.svg)
*Combining multiple parameters (AND logic)*
| Combination | Example | Character |
|---|---|---|
| `ge` + `le` | `ge2023-01-01&le2023-12-31` | Closed interval (both bounds inclusive) |
| `gt` + `lt` | `gt2023-01-01&lt2023-12-31` | Open interval (both bounds exclusive) |
| `sa` + `eb` | `sa2023-01-01&eb2023-12-31` | Strictly separated range, primarily for Period values |
| `ge` + `lt` | `ge2023-06-01&lt2023-07-01` | Half-open interval `[start, end)`, the standard pattern for "exactly one month" |
If you work with `[start, end)` in timestamp-heavy ETL pipelines, `ge` +
`lt` will look familiar: it's exactly the same pattern used for classic
time-window queries in SQL.
---
## The Full 3×3 Matrix of Range Combinations
The four patterns above are only the most common ones. In fact, **any**
lower bound can be combined with **any** upper bound:
- Lower bounds: `ge`, `gt`, `sa`
- Upper bounds: `le`, `lt`, `eb`
That gives 3 × 3 = **9 possible combinations**, all spec-compliant:
![3x3 matrix of range combinations]({static}/images/fhir-date-matrix-3x3_en.svg)
*3x3 matrix of range combinations (lower bound × upper bound)*
They differ only in whether the respective boundary is inclusive (solid
line) or exclusive (dashed line), and whether it's a simple value
comparison (`ge`/`gt`/`le`/`lt`) or a strict Period comparison
(`sa`/`eb`). There is **no explicit exclusion rule** in the FHIR
standard. Every cell in this matrix is a valid, functioning query.
---
## Edge Cases: When Combinations Become Redundant or Contradictory
Not every syntactically valid combination is practically meaningful. There
are three categories you should know about before one of them ends up in a
generated query by accident:
![Edge cases in parameter combinations]({static}/images/fhir-date-edge-cases_en.svg)
*Edge cases in parameter combinations*
### Redundant combinations
Don't change the result, but aren't technically an error either:
- `eq` plus a boundary that's already satisfied by the `eq` interval
(`eq2023-06-15&ge2020-01-01`): the extra condition is superfluous.
- Two conditions of the same directional type
(`ge2020-01-01&ge2023-01-01`): only the stricter (later) lower bound
actually takes effect.
### Combinations with a guaranteed empty result
Structurally impossible to satisfy:
- `eq` + `ne` on the same value (`eq2023-06-15&ne2023-06-15`): mutually
exclusive conditions.
- The lower bound lies after the upper bound in time
(`ge2023-06-01&le2023-01-01`): no date can satisfy both at once.
The server will **syntactically accept** such queries and simply return an
empty result set. Not an error, but not a helpful response either. It's
worth validating this client-side before sending the request.
### Unusual but valid edge cases
- **Three or more `date` parameters**, e.g. a year range with a single day
excluded: `ge2023-01-01&le2023-12-31&ne2023-06-15`.
- **`ap` combined with a boundary**, e.g.
`ap2023-06-15&ge2023-01-01`: rarely used, since `ap` is already fuzzy
by nature, and the tolerance calculation remains server-dependent.
---
## Practical Recommendations
- For simple range filters, **`ge` + `lt`** (half-open interval) is
usually the most robust pattern. It avoids rounding issues at precision
boundaries (no off-by-one when you mean "through December 31st
inclusive").
- Use **`sa`/`eb`** deliberately when you need *complete* separation on
`Period`/`Range` fields (see [Section 3](#3-matching-against-period-and-range)),
e.g. "encounter entirely after discharge X". For a simple "from date X
onward" filter, you usually mean `ge`/`gt`, not `sa`.
- For `Period` fields with possible open ends (see
[Section 4](#4-open-incomplete-periods)), don't forget: `sa`/`eb`
structurally never match there. Additionally filter by `:missing` or
status if needed.
- Before sending a multi-parameter query, it's worth a quick sanity check
on the logical consistency between the lower and upper bound, to avoid
empty results caused by configuration mistakes in your own pipeline.
With the quick reference above and the six graphics in mind, no prefix,
all nine prefixes individually, containment vs. overlap for Period/Range
(both open and closed), typical combinations, the full 3×3 matrix, and the
edge cases, your next `date` query in FHIR should no longer be a mystery.
@@ -102,7 +102,7 @@ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergr
# Images
![Image of a Capybara](./images/capybara.jpg)
![Image of a Capybara]({static}/images/capybara.jpg)
*Image of a Capybara*
# Links
@@ -0,0 +1,124 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1056" viewBox="0 0 1000 1056" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#2e7d32"] { fill: #66bb6a; }
[stroke="#2e7d32"] { stroke: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
[stroke="#1565c0"] { stroke: #64b5f6; }
[fill="#6a1b9a"] { fill: #ba68c8; }
[stroke="#6a1b9a"] { stroke: #ba68c8; }
[fill="#ad1457"] { fill: #f06292; }
[stroke="#ad1457"] { stroke: #f06292; }
[fill="#bf360c"] { fill: #ff7043; }
[stroke="#bf360c"] { stroke: #ff7043; }
[fill="#e65100"] { fill: #ffa726; }
[stroke="#e65100"] { stroke: #ffa726; }
[fill="#00838f"] { fill: #4dd0e1; }
[stroke="#00838f"] { stroke: #4dd0e1; }
[fill="#004d40"] { fill: #26a69a; }
[stroke="#004d40"] { stroke: #26a69a; }
}
</style>
<text x="500.0" y="24" font-size="15" fill="#555" text-anchor="middle">Roter gestrichelter Marker = Suchwert 2023-06-15 • Farbig schattierter Bereich = Bereich, der als Treffer gilt</text>
<text x="60" y="56" font-size="15" font-weight="700" fill="#111">eq — gleich</text>
<text x="940" y="56" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eq2023-06-15</text>
<rect x="475.0" y="82" width="50.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="92" x2="940" y2="92" stroke="#333" stroke-width="2"/>
<polygon points="940,92 932,87 932,97" fill="#333"/>
<line x1="475.0" y1="78" x2="475.0" y2="106" stroke="#2e7d32" stroke-width="3"/>
<line x1="525.0" y1="78" x2="525.0" y2="106" stroke="#2e7d32" stroke-width="3"/>
<line x1="500.0" y1="68" x2="500.0" y2="116" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="92" r="4.5" fill="#c62828"/>
<text x="500.0" y="62" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="138" font-size="12" fill="#444" font-style="italic">Resource-Intervall liegt vollstaendig im Such-Intervall.</text>
<text x="60" y="166" font-size="15" font-weight="700" fill="#111">ne — ungleich</text>
<text x="940" y="166" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ne2023-06-15</text>
<rect x="60" y="192" width="415.0" height="20" fill="#ad1457" opacity="0.22"/>
<rect x="525.0" y="192" width="415.0" height="20" fill="#ad1457" opacity="0.22"/>
<line x1="60" y1="202" x2="940" y2="202" stroke="#333" stroke-width="2"/>
<polygon points="940,202 932,197 932,207" fill="#333"/>
<line x1="475.0" y1="188" x2="475.0" y2="216" stroke="#ad1457" stroke-width="3"/>
<line x1="525.0" y1="188" x2="525.0" y2="216" stroke="#ad1457" stroke-width="3"/>
<line x1="500.0" y1="178" x2="500.0" y2="226" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="202" r="4.5" fill="#c62828"/>
<text x="500.0" y="172" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="248" font-size="12" fill="#444" font-style="italic">Resource-Intervall liegt NICHT vollstaendig im Such-Intervall (Komplement von eq).</text>
<text x="60" y="276" font-size="15" font-weight="700" fill="#111">gt — groesser als</text>
<text x="940" y="276" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt2023-06-15</text>
<rect x="525.0" y="302" width="415.0" height="20" fill="#e65100" opacity="0.22"/>
<line x1="60" y1="312" x2="940" y2="312" stroke="#333" stroke-width="2"/>
<polygon points="940,312 932,307 932,317" fill="#333"/>
<line x1="525.0" y1="298" x2="525.0" y2="326" stroke="#e65100" stroke-width="3" />
<line x1="500.0" y1="288" x2="500.0" y2="336" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="312" r="4.5" fill="#c62828"/>
<text x="500.0" y="282" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="358" font-size="12" fill="#444" font-style="italic">Resource-Intervall ragt ueber das Ende des Such-Intervalls hinaus (Overlap genuegt).</text>
<text x="60" y="386" font-size="15" font-weight="700" fill="#111">lt — kleiner als</text>
<text x="940" y="386" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=lt2023-06-15</text>
<rect x="60" y="412" width="415.0" height="20" fill="#00838f" opacity="0.22"/>
<line x1="60" y1="422" x2="940" y2="422" stroke="#333" stroke-width="2"/>
<polygon points="940,422 932,417 932,427" fill="#333"/>
<line x1="475.0" y1="408" x2="475.0" y2="436" stroke="#00838f" stroke-width="3" />
<line x1="500.0" y1="398" x2="500.0" y2="446" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="422" r="4.5" fill="#c62828"/>
<text x="500.0" y="392" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="468" font-size="12" fill="#444" font-style="italic">Resource-Intervall beginnt vor dem Anfang des Such-Intervalls (Overlap genuegt).</text>
<text x="60" y="496" font-size="15" font-weight="700" fill="#111">ge — groesser/gleich</text>
<text x="940" y="496" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-06-15</text>
<rect x="475.0" y="522" width="465.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="532" x2="940" y2="532" stroke="#333" stroke-width="2"/>
<polygon points="940,532 932,527 932,537" fill="#333"/>
<line x1="475.0" y1="518" x2="475.0" y2="546" stroke="#2e7d32" stroke-width="3" />
<line x1="500.0" y1="508" x2="500.0" y2="556" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="532" r="4.5" fill="#c62828"/>
<text x="500.0" y="502" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="578" font-size="12" fill="#444" font-style="italic">gt ODER vollstaendig im Such-Intervall enthalten (eq).</text>
<text x="60" y="606" font-size="15" font-weight="700" fill="#111">le — kleiner/gleich</text>
<text x="940" y="606" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=le2023-06-15</text>
<rect x="60" y="632" width="465.0" height="20" fill="#1565c0" opacity="0.22"/>
<line x1="60" y1="642" x2="940" y2="642" stroke="#333" stroke-width="2"/>
<polygon points="940,642 932,637 932,647" fill="#333"/>
<line x1="525.0" y1="628" x2="525.0" y2="656" stroke="#1565c0" stroke-width="3" />
<line x1="500.0" y1="618" x2="500.0" y2="666" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="642" r="4.5" fill="#c62828"/>
<text x="500.0" y="612" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="688" font-size="12" fill="#444" font-style="italic">lt ODER vollstaendig im Such-Intervall enthalten (eq).</text>
<text x="60" y="716" font-size="15" font-weight="700" fill="#111">sa — startet nach (starts after)</text>
<text x="940" y="716" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa2023-06-15</text>
<rect x="525.0" y="742" width="415.0" height="20" fill="#bf360c" opacity="0.22"/>
<line x1="60" y1="752" x2="940" y2="752" stroke="#333" stroke-width="2"/>
<polygon points="940,752 932,747 932,757" fill="#333"/>
<line x1="525.0" y1="738" x2="525.0" y2="766" stroke="#bf360c" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="500.0" y1="728" x2="500.0" y2="776" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="752" r="4.5" fill="#c62828"/>
<text x="500.0" y="722" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="798" font-size="12" fill="#444" font-style="italic">Resource-Intervall beginnt vollstaendig nach dem Ende des Such-Intervalls, keine Ueberlappung (strikter als gt bei Ranges).</text>
<text x="60" y="826" font-size="15" font-weight="700" fill="#111">eb — endet vor (ends before)</text>
<text x="940" y="826" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eb2023-06-15</text>
<rect x="60" y="852" width="415.0" height="20" fill="#004d40" opacity="0.22"/>
<line x1="60" y1="862" x2="940" y2="862" stroke="#333" stroke-width="2"/>
<polygon points="940,862 932,857 932,867" fill="#333"/>
<line x1="475.0" y1="848" x2="475.0" y2="876" stroke="#004d40" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="500.0" y1="838" x2="500.0" y2="886" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="862" r="4.5" fill="#c62828"/>
<text x="500.0" y="832" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="908" font-size="12" fill="#444" font-style="italic">Resource-Intervall endet vollstaendig vor dem Beginn des Such-Intervalls, keine Ueberlappung (strikter als lt bei Ranges).</text>
<text x="60" y="936" font-size="15" font-weight="700" fill="#111">ap — ungefaehr (approximately)</text>
<text x="940" y="936" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ap2023-06-15</text>
<rect x="440.0" y="962" width="120" height="20" fill="#6a1b9a" opacity="0.22"/>
<line x1="60" y1="972" x2="940" y2="972" stroke="#333" stroke-width="2"/>
<polygon points="940,972 932,967 932,977" fill="#333"/>
<line x1="440.0" y1="958" x2="440.0" y2="986" stroke="#6a1b9a" stroke-width="3"/>
<line x1="560.0" y1="958" x2="560.0" y2="986" stroke="#6a1b9a" stroke-width="3"/>
<line x1="500.0" y1="948" x2="500.0" y2="996" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="972" r="4.5" fill="#c62828"/>
<text x="500.0" y="942" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="1018" font-size="12" fill="#444" font-style="italic">Resource-Datum liegt 'in der Naehe' des Suchwerts (implementierungsabhaengige Toleranz, z.B. +/-10%).</text>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,124 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1056" viewBox="0 0 1000 1056" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#2e7d32"] { fill: #66bb6a; }
[stroke="#2e7d32"] { stroke: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
[stroke="#1565c0"] { stroke: #64b5f6; }
[fill="#6a1b9a"] { fill: #ba68c8; }
[stroke="#6a1b9a"] { stroke: #ba68c8; }
[fill="#ad1457"] { fill: #f06292; }
[stroke="#ad1457"] { stroke: #f06292; }
[fill="#bf360c"] { fill: #ff7043; }
[stroke="#bf360c"] { stroke: #ff7043; }
[fill="#e65100"] { fill: #ffa726; }
[stroke="#e65100"] { stroke: #ffa726; }
[fill="#00838f"] { fill: #4dd0e1; }
[stroke="#00838f"] { stroke: #4dd0e1; }
[fill="#004d40"] { fill: #26a69a; }
[stroke="#004d40"] { stroke: #26a69a; }
}
</style>
<text x="500.0" y="24" font-size="15" fill="#555" text-anchor="middle">Red dashed marker = search value 2023-06-15 • Colored shaded area = range considered a match</text>
<text x="60" y="56" font-size="15" font-weight="700" fill="#111">eq — equal to</text>
<text x="940" y="56" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eq2023-06-15</text>
<rect x="475.0" y="82" width="50.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="92" x2="940" y2="92" stroke="#333" stroke-width="2"/>
<polygon points="940,92 932,87 932,97" fill="#333"/>
<line x1="475.0" y1="78" x2="475.0" y2="106" stroke="#2e7d32" stroke-width="3"/>
<line x1="525.0" y1="78" x2="525.0" y2="106" stroke="#2e7d32" stroke-width="3"/>
<line x1="500.0" y1="68" x2="500.0" y2="116" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="92" r="4.5" fill="#c62828"/>
<text x="500.0" y="62" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="138" font-size="12" fill="#444" font-style="italic">Resource interval lies fully within the search interval.</text>
<text x="60" y="166" font-size="15" font-weight="700" fill="#111">ne — not equal to</text>
<text x="940" y="166" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ne2023-06-15</text>
<rect x="60" y="192" width="415.0" height="20" fill="#ad1457" opacity="0.22"/>
<rect x="525.0" y="192" width="415.0" height="20" fill="#ad1457" opacity="0.22"/>
<line x1="60" y1="202" x2="940" y2="202" stroke="#333" stroke-width="2"/>
<polygon points="940,202 932,197 932,207" fill="#333"/>
<line x1="475.0" y1="188" x2="475.0" y2="216" stroke="#ad1457" stroke-width="3"/>
<line x1="525.0" y1="188" x2="525.0" y2="216" stroke="#ad1457" stroke-width="3"/>
<line x1="500.0" y1="178" x2="500.0" y2="226" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="202" r="4.5" fill="#c62828"/>
<text x="500.0" y="172" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="248" font-size="12" fill="#444" font-style="italic">Resource interval does NOT lie fully within the search interval (complement of eq).</text>
<text x="60" y="276" font-size="15" font-weight="700" fill="#111">gt — greater than</text>
<text x="940" y="276" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt2023-06-15</text>
<rect x="525.0" y="302" width="415.0" height="20" fill="#e65100" opacity="0.22"/>
<line x1="60" y1="312" x2="940" y2="312" stroke="#333" stroke-width="2"/>
<polygon points="940,312 932,307 932,317" fill="#333"/>
<line x1="525.0" y1="298" x2="525.0" y2="326" stroke="#e65100" stroke-width="3" />
<line x1="500.0" y1="288" x2="500.0" y2="336" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="312" r="4.5" fill="#c62828"/>
<text x="500.0" y="282" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="358" font-size="12" fill="#444" font-style="italic">Resource interval extends beyond the end of the search interval (overlap is sufficient).</text>
<text x="60" y="386" font-size="15" font-weight="700" fill="#111">lt — less than</text>
<text x="940" y="386" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=lt2023-06-15</text>
<rect x="60" y="412" width="415.0" height="20" fill="#00838f" opacity="0.22"/>
<line x1="60" y1="422" x2="940" y2="422" stroke="#333" stroke-width="2"/>
<polygon points="940,422 932,417 932,427" fill="#333"/>
<line x1="475.0" y1="408" x2="475.0" y2="436" stroke="#00838f" stroke-width="3" />
<line x1="500.0" y1="398" x2="500.0" y2="446" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="422" r="4.5" fill="#c62828"/>
<text x="500.0" y="392" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="468" font-size="12" fill="#444" font-style="italic">Resource interval begins before the start of the search interval (overlap is sufficient).</text>
<text x="60" y="496" font-size="15" font-weight="700" fill="#111">ge — greater or equal</text>
<text x="940" y="496" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-06-15</text>
<rect x="475.0" y="522" width="465.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="532" x2="940" y2="532" stroke="#333" stroke-width="2"/>
<polygon points="940,532 932,527 932,537" fill="#333"/>
<line x1="475.0" y1="518" x2="475.0" y2="546" stroke="#2e7d32" stroke-width="3" />
<line x1="500.0" y1="508" x2="500.0" y2="556" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="532" r="4.5" fill="#c62828"/>
<text x="500.0" y="502" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="578" font-size="12" fill="#444" font-style="italic">gt OR fully contained within the search interval (eq).</text>
<text x="60" y="606" font-size="15" font-weight="700" fill="#111">le — less or equal</text>
<text x="940" y="606" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=le2023-06-15</text>
<rect x="60" y="632" width="465.0" height="20" fill="#1565c0" opacity="0.22"/>
<line x1="60" y1="642" x2="940" y2="642" stroke="#333" stroke-width="2"/>
<polygon points="940,642 932,637 932,647" fill="#333"/>
<line x1="525.0" y1="628" x2="525.0" y2="656" stroke="#1565c0" stroke-width="3" />
<line x1="500.0" y1="618" x2="500.0" y2="666" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="642" r="4.5" fill="#c62828"/>
<text x="500.0" y="612" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="688" font-size="12" fill="#444" font-style="italic">lt OR fully contained within the search interval (eq).</text>
<text x="60" y="716" font-size="15" font-weight="700" fill="#111">sa — starts after</text>
<text x="940" y="716" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa2023-06-15</text>
<rect x="525.0" y="742" width="415.0" height="20" fill="#bf360c" opacity="0.22"/>
<line x1="60" y1="752" x2="940" y2="752" stroke="#333" stroke-width="2"/>
<polygon points="940,752 932,747 932,757" fill="#333"/>
<line x1="525.0" y1="738" x2="525.0" y2="766" stroke="#bf360c" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="500.0" y1="728" x2="500.0" y2="776" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="752" r="4.5" fill="#c62828"/>
<text x="500.0" y="722" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="798" font-size="12" fill="#444" font-style="italic">Resource interval begins entirely after the end of the search interval, no overlap (stricter than gt for ranges).</text>
<text x="60" y="826" font-size="15" font-weight="700" fill="#111">eb — ends before</text>
<text x="940" y="826" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eb2023-06-15</text>
<rect x="60" y="852" width="415.0" height="20" fill="#004d40" opacity="0.22"/>
<line x1="60" y1="862" x2="940" y2="862" stroke="#333" stroke-width="2"/>
<polygon points="940,862 932,857 932,867" fill="#333"/>
<line x1="475.0" y1="848" x2="475.0" y2="876" stroke="#004d40" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="500.0" y1="838" x2="500.0" y2="886" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="862" r="4.5" fill="#c62828"/>
<text x="500.0" y="832" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="908" font-size="12" fill="#444" font-style="italic">Resource interval ends entirely before the start of the search interval, no overlap (stricter than lt for ranges).</text>
<text x="60" y="936" font-size="15" font-weight="700" fill="#111">ap — approximately</text>
<text x="940" y="936" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ap2023-06-15</text>
<rect x="440.0" y="962" width="120" height="20" fill="#6a1b9a" opacity="0.22"/>
<line x1="60" y1="972" x2="940" y2="972" stroke="#333" stroke-width="2"/>
<polygon points="940,972 932,967 932,977" fill="#333"/>
<line x1="440.0" y1="958" x2="440.0" y2="986" stroke="#6a1b9a" stroke-width="3"/>
<line x1="560.0" y1="958" x2="560.0" y2="986" stroke="#6a1b9a" stroke-width="3"/>
<line x1="500.0" y1="948" x2="500.0" y2="996" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="972" r="4.5" fill="#c62828"/>
<text x="500.0" y="942" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="1018" font-size="12" fill="#444" font-style="italic">Resource date lies 'near' the search value (implementation-dependent tolerance, e.g. +/-10%).</text>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,56 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="586" viewBox="0 0 1000 586" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#2e7d32"] { fill: #66bb6a; }
[stroke="#2e7d32"] { stroke: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[fill="#6a1b9a"] { fill: #ba68c8; }
}
</style>
<text x="500.0" y="24" font-size="15" fill="#555" text-anchor="middle">Mehrere date-Parameter in derselben Query werden UND-verknuepft und ergeben einen Bereich</text>
<text x="60" y="56" font-size="15" font-weight="700" fill="#111">Geschlossenes Intervall (inklusiv)</text>
<text x="940" y="56" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-01-01&amp;date=le2023-12-31</text>
<rect x="340.0" y="91" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="101" x2="940" y2="101" stroke="#333" stroke-width="2"/>
<polygon points="940,101 932,96 932,106" fill="#333"/>
<line x1="340.0" y1="85" x2="340.0" y2="117" stroke="#2e7d32" stroke-width="3" />
<line x1="660.0" y1="85" x2="660.0" y2="117" stroke="#2e7d32" stroke-width="3" />
<text x="340.0" y="77" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">ge (geschlossen)</text>
<text x="660.0" y="77" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">le (geschlossen)</text>
<text x="60" y="141" font-size="12" fill="#444" font-style="italic">Beide Grenzen sind inklusive Teil des Ergebnisses -- klassischer 'Jahresbereich'.</text>
<text x="60" y="186" font-size="15" font-weight="700" fill="#111">Offenes Intervall (exklusiv)</text>
<text x="940" y="186" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt2023-01-01&amp;date=lt2023-12-31</text>
<rect x="340.0" y="221" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="231" x2="940" y2="231" stroke="#333" stroke-width="2"/>
<polygon points="940,231 932,226 932,236" fill="#333"/>
<line x1="340.0" y1="215" x2="340.0" y2="247" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="660.0" y1="215" x2="660.0" y2="247" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<text x="340.0" y="207" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">gt (offen)</text>
<text x="660.0" y="207" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">lt (offen)</text>
<text x="60" y="271" font-size="12" fill="#444" font-style="italic">Randwerte selbst sind ausgeschlossen -- enger als ge/le.</text>
<text x="60" y="316" font-size="15" font-weight="700" fill="#111">Strikt getrennter Bereich (sa + eb)</text>
<text x="940" y="316" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa2023-01-01&amp;date=eb2023-12-31</text>
<rect x="340.0" y="351" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="361" x2="940" y2="361" stroke="#333" stroke-width="2"/>
<polygon points="940,361 932,356 932,366" fill="#333"/>
<line x1="340.0" y1="345" x2="340.0" y2="377" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="660.0" y1="345" x2="660.0" y2="377" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<text x="340.0" y="337" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">sa (offen)</text>
<text x="660.0" y="337" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">eb (offen)</text>
<text x="60" y="401" font-size="12" fill="#444" font-style="italic">Nur fuer Perioden/Ranges relevant: Resource-Range muss vollstaendig NACH dem 1. und vollstaendig VOR dem 2. Wert liegen.</text>
<text x="60" y="446" font-size="15" font-weight="700" fill="#111">Untere Grenze + oberer Ausschluss</text>
<text x="940" y="446" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-06-01&amp;date=lt2023-07-01</text>
<rect x="340.0" y="481" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="491" x2="940" y2="491" stroke="#333" stroke-width="2"/>
<polygon points="940,491 932,486 932,496" fill="#333"/>
<line x1="340.0" y1="475" x2="340.0" y2="507" stroke="#2e7d32" stroke-width="3" />
<line x1="660.0" y1="475" x2="660.0" y2="507" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<text x="340.0" y="467" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">ge (geschlossen)</text>
<text x="660.0" y="467" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">lt (offen)</text>
<text x="60" y="531" font-size="12" fill="#444" font-style="italic">Typisches Muster fuer 'genau ein Monat' bei Timestamp-Feldern: [start, ende).</text>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

@@ -0,0 +1,56 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="586" viewBox="0 0 1000 586" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#2e7d32"] { fill: #66bb6a; }
[stroke="#2e7d32"] { stroke: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[fill="#6a1b9a"] { fill: #ba68c8; }
}
</style>
<text x="500.0" y="24" font-size="15" fill="#555" text-anchor="middle">Multiple date parameters in the same query are combined with AND and define a range</text>
<text x="60" y="56" font-size="15" font-weight="700" fill="#111">Closed interval (inclusive)</text>
<text x="940" y="56" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-01-01&amp;date=le2023-12-31</text>
<rect x="340.0" y="91" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="101" x2="940" y2="101" stroke="#333" stroke-width="2"/>
<polygon points="940,101 932,96 932,106" fill="#333"/>
<line x1="340.0" y1="85" x2="340.0" y2="117" stroke="#2e7d32" stroke-width="3" />
<line x1="660.0" y1="85" x2="660.0" y2="117" stroke="#2e7d32" stroke-width="3" />
<text x="340.0" y="77" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">ge (closed)</text>
<text x="660.0" y="77" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">le (closed)</text>
<text x="60" y="141" font-size="12" fill="#444" font-style="italic">Both boundaries are inclusively part of the result -- the classic 'year range'.</text>
<text x="60" y="186" font-size="15" font-weight="700" fill="#111">Open interval (exclusive)</text>
<text x="940" y="186" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt2023-01-01&amp;date=lt2023-12-31</text>
<rect x="340.0" y="221" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="231" x2="940" y2="231" stroke="#333" stroke-width="2"/>
<polygon points="940,231 932,226 932,236" fill="#333"/>
<line x1="340.0" y1="215" x2="340.0" y2="247" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="660.0" y1="215" x2="660.0" y2="247" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<text x="340.0" y="207" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">gt (open)</text>
<text x="660.0" y="207" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">lt (open)</text>
<text x="60" y="271" font-size="12" fill="#444" font-style="italic">The boundary values themselves are excluded -- narrower than ge/le.</text>
<text x="60" y="316" font-size="15" font-weight="700" fill="#111">Strictly separated range (sa + eb)</text>
<text x="940" y="316" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa2023-01-01&amp;date=eb2023-12-31</text>
<rect x="340.0" y="351" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="361" x2="940" y2="361" stroke="#333" stroke-width="2"/>
<polygon points="940,361 932,356 932,366" fill="#333"/>
<line x1="340.0" y1="345" x2="340.0" y2="377" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<line x1="660.0" y1="345" x2="660.0" y2="377" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<text x="340.0" y="337" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">sa (open)</text>
<text x="660.0" y="337" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">eb (open)</text>
<text x="60" y="401" font-size="12" fill="#444" font-style="italic">Only relevant for Period/Range values: the resource range must lie entirely AFTER the 1st and entirely BEFORE the 2nd value.</text>
<text x="60" y="446" font-size="15" font-weight="700" fill="#111">Lower bound + upper exclusion</text>
<text x="940" y="446" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-06-01&amp;date=lt2023-07-01</text>
<rect x="340.0" y="481" width="320.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="491" x2="940" y2="491" stroke="#333" stroke-width="2"/>
<polygon points="940,491 932,486 932,496" fill="#333"/>
<line x1="340.0" y1="475" x2="340.0" y2="507" stroke="#2e7d32" stroke-width="3" />
<line x1="660.0" y1="475" x2="660.0" y2="507" stroke="#2e7d32" stroke-width="3" stroke-dasharray="4,4"/>
<text x="340.0" y="467" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">ge (closed)</text>
<text x="660.0" y="467" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">lt (open)</text>
<text x="60" y="531" font-size="12" fill="#444" font-style="italic">Typical pattern for 'exactly one month' on timestamp fields: [start, end).</text>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

@@ -0,0 +1,71 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="846" viewBox="0 0 1000 846" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#ffffff"] { fill: #121212; }
[fill="#c62828"] { fill: #ff6659; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#6a1b9a"] { fill: #ba68c8; }
[fill="#f9a825"] { fill: #ffca28; }
[stroke="#f9a825"] { stroke: #ffca28; }
}
</style>
<text x="500.0" y="24" font-size="14" fill="#555" text-anchor="middle">Redundante, widerspruechliche und ungewoehnliche, aber spec-konforme Kombinationen</text>
<rect x="60" y="32" width="170" height="20" rx="4" fill="#f9a825" opacity="0.15"/>
<text x="145" y="46" font-size="11" font-weight="700" fill="#f9a825" text-anchor="middle">REDUNDANT</text>
<text x="60" y="68" font-size="15" font-weight="700" fill="#111">Redundant: eq + Grenzwert</text>
<text x="940" y="68" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eq2023-06-15&amp;date=ge2020-01-01</text>
<line x1="60" y1="92" x2="940" y2="92" stroke="#333" stroke-width="2"/>
<polygon points="940,92 932,87 932,97" fill="#333"/>
<rect x="400.0" y="82" width="200" height="20" fill="#f9a825" opacity="0.25"/>
<line x1="600.0" y1="76" x2="600.0" y2="108" stroke="#f9a825" stroke-width="3"/>
<text x="60" y="152" font-size="12.5" fill="#444" font-style="italic">eq2023-06-15 deckt bereits ein volles Intervall ab; die zusaetzliche ge-Bedingung aendert nichts, da 2023 &gt; 2020 ohnehin erfuellt ist.</text>
<rect x="60" y="162" width="170" height="20" rx="4" fill="#c62828" opacity="0.15"/>
<text x="145" y="176" font-size="11" font-weight="700" fill="#c62828" text-anchor="middle">LEERES ERGEBNIS</text>
<text x="60" y="198" font-size="15" font-weight="700" fill="#111">Widerspruch: eq + ne auf denselben Wert</text>
<text x="940" y="198" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eq2023-06-15&amp;date=ne2023-06-15</text>
<line x1="60" y1="222" x2="940" y2="222" stroke="#333" stroke-width="2"/>
<polygon points="940,222 932,217 932,227" fill="#333"/>
<line x1="485.0" y1="207" x2="515.0" y2="237" stroke="#c62828" stroke-width="4"/>
<line x1="485.0" y1="237" x2="515.0" y2="207" stroke="#c62828" stroke-width="4"/>
<text x="60" y="282" font-size="12.5" fill="#444" font-style="italic">eq verlangt Enthaltensein, ne verlangt Nicht-Enthaltensein im selben Intervall -&gt; IMMER leeres Ergebnis.</text>
<rect x="60" y="292" width="170" height="20" rx="4" fill="#c62828" opacity="0.15"/>
<text x="145" y="306" font-size="11" font-weight="700" fill="#c62828" text-anchor="middle">LEERES ERGEBNIS</text>
<text x="60" y="328" font-size="15" font-weight="700" fill="#111">Widerspruch: sich ausschliessende Grenzen</text>
<text x="940" y="328" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-06-01&amp;date=le2023-01-01</text>
<line x1="60" y1="352" x2="940" y2="352" stroke="#333" stroke-width="2"/>
<polygon points="940,352 932,347 932,357" fill="#333"/>
<line x1="485.0" y1="337" x2="515.0" y2="367" stroke="#c62828" stroke-width="4"/>
<line x1="485.0" y1="367" x2="515.0" y2="337" stroke="#c62828" stroke-width="4"/>
<text x="60" y="412" font-size="12.5" fill="#444" font-style="italic">Untergrenze liegt NACH der Obergrenze -&gt; kein Datum kann beide Bedingungen erfuellen -&gt; leeres Ergebnis.</text>
<rect x="60" y="422" width="170" height="20" rx="4" fill="#f9a825" opacity="0.15"/>
<text x="145" y="436" font-size="11" font-weight="700" fill="#f9a825" text-anchor="middle">REDUNDANT</text>
<text x="60" y="458" font-size="15" font-weight="700" fill="#111">Redundant: gleicher Praefix doppelt</text>
<text x="940" y="458" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2020-01-01&amp;date=ge2023-01-01</text>
<line x1="60" y1="482" x2="940" y2="482" stroke="#333" stroke-width="2"/>
<polygon points="940,482 932,477 932,487" fill="#333"/>
<rect x="400.0" y="472" width="200" height="20" fill="#f9a825" opacity="0.25"/>
<line x1="600.0" y1="466" x2="600.0" y2="498" stroke="#f9a825" stroke-width="3"/>
<text x="60" y="542" font-size="12.5" fill="#444" font-style="italic">Beide Bedingungen sind vom Typ ge; nur die strengere (spaetere) Untergrenze 2023 ist effektiv wirksam.</text>
<rect x="60" y="552" width="170" height="20" rx="4" fill="#6a1b9a" opacity="0.15"/>
<text x="145" y="566" font-size="11" font-weight="700" fill="#6a1b9a" text-anchor="middle">SONDERFALL</text>
<text x="60" y="588" font-size="15" font-weight="700" fill="#111">Sonderfall: drei Parameter (Ausschluss einer Teilspanne)</text>
<text x="940" y="588" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-01-01&amp;date=le2023-12-31&amp;date=ne2023-06-15</text>
<line x1="60" y1="612" x2="940" y2="612" stroke="#333" stroke-width="2"/>
<polygon points="940,612 932,607 932,617" fill="#333"/>
<rect x="380.0" y="602" width="240" height="20" fill="#6a1b9a" opacity="0.2"/>
<rect x="492.0" y="602" width="16" height="20" fill="#ffffff"/>
<text x="60" y="672" font-size="12.5" fill="#444" font-style="italic">Spec-konform: Jahresbereich, aus dem zusaetzlich ein einzelner Tag per ne ausgeschlossen wird.</text>
<rect x="60" y="682" width="170" height="20" rx="4" fill="#6a1b9a" opacity="0.15"/>
<text x="145" y="696" font-size="11" font-weight="700" fill="#6a1b9a" text-anchor="middle">SONDERFALL</text>
<text x="60" y="718" font-size="15" font-weight="700" fill="#111">Sonderfall: ap kombiniert mit Grenze</text>
<text x="940" y="718" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ap2023-06-15&amp;date=ge2023-01-01</text>
<line x1="60" y1="742" x2="940" y2="742" stroke="#333" stroke-width="2"/>
<polygon points="940,742 932,737 932,747" fill="#333"/>
<rect x="380.0" y="732" width="240" height="20" fill="#6a1b9a" opacity="0.2"/>
<text x="60" y="802" font-size="12.5" fill="#444" font-style="italic">Selten verwendet: unscharfe Naeherung zusaetzlich auf einen Mindestwert eingeschraenkt (Toleranz ist serverabhaengig).</text>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

@@ -0,0 +1,71 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="846" viewBox="0 0 1000 846" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#ffffff"] { fill: #121212; }
[fill="#c62828"] { fill: #ff6659; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#6a1b9a"] { fill: #ba68c8; }
[fill="#f9a825"] { fill: #ffca28; }
[stroke="#f9a825"] { stroke: #ffca28; }
}
</style>
<text x="500.0" y="24" font-size="14" fill="#555" text-anchor="middle">Redundant, contradictory, and unusual but spec-compliant combinations</text>
<rect x="60" y="32" width="170" height="20" rx="4" fill="#f9a825" opacity="0.15"/>
<text x="145" y="46" font-size="11" font-weight="700" fill="#f9a825" text-anchor="middle">REDUNDANT</text>
<text x="60" y="68" font-size="15" font-weight="700" fill="#111">Redundant: eq + boundary</text>
<text x="940" y="68" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eq2023-06-15&amp;date=ge2020-01-01</text>
<line x1="60" y1="92" x2="940" y2="92" stroke="#333" stroke-width="2"/>
<polygon points="940,92 932,87 932,97" fill="#333"/>
<rect x="400.0" y="82" width="200" height="20" fill="#f9a825" opacity="0.25"/>
<line x1="600.0" y1="76" x2="600.0" y2="108" stroke="#f9a825" stroke-width="3"/>
<text x="60" y="152" font-size="12.5" fill="#444" font-style="italic">eq2023-06-15 already covers a full interval; the additional ge condition changes nothing, since 2023 &gt; 2020 is satisfied anyway.</text>
<rect x="60" y="162" width="170" height="20" rx="4" fill="#c62828" opacity="0.15"/>
<text x="145" y="176" font-size="11" font-weight="700" fill="#c62828" text-anchor="middle">EMPTY RESULT</text>
<text x="60" y="198" font-size="15" font-weight="700" fill="#111">Contradiction: eq + ne on the same value</text>
<text x="940" y="198" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=eq2023-06-15&amp;date=ne2023-06-15</text>
<line x1="60" y1="222" x2="940" y2="222" stroke="#333" stroke-width="2"/>
<polygon points="940,222 932,217 932,227" fill="#333"/>
<line x1="485.0" y1="207" x2="515.0" y2="237" stroke="#c62828" stroke-width="4"/>
<line x1="485.0" y1="237" x2="515.0" y2="207" stroke="#c62828" stroke-width="4"/>
<text x="60" y="282" font-size="12.5" fill="#444" font-style="italic">eq requires containment, ne requires non-containment in the same interval -&gt; ALWAYS an empty result.</text>
<rect x="60" y="292" width="170" height="20" rx="4" fill="#c62828" opacity="0.15"/>
<text x="145" y="306" font-size="11" font-weight="700" fill="#c62828" text-anchor="middle">EMPTY RESULT</text>
<text x="60" y="328" font-size="15" font-weight="700" fill="#111">Contradiction: mutually exclusive bounds</text>
<text x="940" y="328" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-06-01&amp;date=le2023-01-01</text>
<line x1="60" y1="352" x2="940" y2="352" stroke="#333" stroke-width="2"/>
<polygon points="940,352 932,347 932,357" fill="#333"/>
<line x1="485.0" y1="337" x2="515.0" y2="367" stroke="#c62828" stroke-width="4"/>
<line x1="485.0" y1="367" x2="515.0" y2="337" stroke="#c62828" stroke-width="4"/>
<text x="60" y="412" font-size="12.5" fill="#444" font-style="italic">Lower bound lies AFTER the upper bound -&gt; no date can satisfy both conditions -&gt; empty result.</text>
<rect x="60" y="422" width="170" height="20" rx="4" fill="#f9a825" opacity="0.15"/>
<text x="145" y="436" font-size="11" font-weight="700" fill="#f9a825" text-anchor="middle">REDUNDANT</text>
<text x="60" y="458" font-size="15" font-weight="700" fill="#111">Redundant: same prefix twice</text>
<text x="940" y="458" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2020-01-01&amp;date=ge2023-01-01</text>
<line x1="60" y1="482" x2="940" y2="482" stroke="#333" stroke-width="2"/>
<polygon points="940,482 932,477 932,487" fill="#333"/>
<rect x="400.0" y="472" width="200" height="20" fill="#f9a825" opacity="0.25"/>
<line x1="600.0" y1="466" x2="600.0" y2="498" stroke="#f9a825" stroke-width="3"/>
<text x="60" y="542" font-size="12.5" fill="#444" font-style="italic">Both conditions are of type ge; only the stricter (later) lower bound 2023 is effectively in force.</text>
<rect x="60" y="552" width="170" height="20" rx="4" fill="#6a1b9a" opacity="0.15"/>
<text x="145" y="566" font-size="11" font-weight="700" fill="#6a1b9a" text-anchor="middle">SPECIAL CASE</text>
<text x="60" y="588" font-size="15" font-weight="700" fill="#111">Special case: three parameters (excluding a sub-range)</text>
<text x="940" y="588" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge2023-01-01&amp;date=le2023-12-31&amp;date=ne2023-06-15</text>
<line x1="60" y1="612" x2="940" y2="612" stroke="#333" stroke-width="2"/>
<polygon points="940,612 932,607 932,617" fill="#333"/>
<rect x="380.0" y="602" width="240" height="20" fill="#6a1b9a" opacity="0.2"/>
<rect x="492.0" y="602" width="16" height="20" fill="#ffffff"/>
<text x="60" y="672" font-size="12.5" fill="#444" font-style="italic">Spec-compliant: a year range from which a single day is additionally excluded via ne.</text>
<rect x="60" y="682" width="170" height="20" rx="4" fill="#6a1b9a" opacity="0.15"/>
<text x="145" y="696" font-size="11" font-weight="700" fill="#6a1b9a" text-anchor="middle">SPECIAL CASE</text>
<text x="60" y="718" font-size="15" font-weight="700" fill="#111">Special case: ap combined with a boundary</text>
<text x="940" y="718" font-size="12.5" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ap2023-06-15&amp;date=ge2023-01-01</text>
<line x1="60" y1="742" x2="940" y2="742" stroke="#333" stroke-width="2"/>
<polygon points="940,742 932,737 932,747" fill="#333"/>
<rect x="380.0" y="732" width="240" height="20" fill="#6a1b9a" opacity="0.2"/>
<text x="60" y="802" font-size="12.5" fill="#444" font-style="italic">Rarely used: a fuzzy approximation additionally constrained to a minimum value (tolerance is server-dependent).</text>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

@@ -0,0 +1,92 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1100" height="590" viewBox="0 0 1100 590" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#fafafa"] { fill: #2a2a2a; }
[stroke="#ddd"] { stroke: #484848; }
[fill="#2e7d32"] { fill: #66bb6a; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
[fill="#6a1b9a"] { fill: #ba68c8; }
}
</style>
<text x="550.0" y="24" font-size="14" fill="#555" text-anchor="middle">Jede Zelle = eine gueltige Kombination aus zwei date-Parametern (z.B. date=ge...&amp;date=le...)</text>
<text x="380.0" y="65" font-size="16" font-weight="700" fill="#1565c0" text-anchor="middle">le</text>
<text x="380.0" y="82" font-size="11" fill="#1565c0" text-anchor="middle">≤ (bis einschl.)</text>
<text x="700.0" y="65" font-size="16" font-weight="700" fill="#1565c0" text-anchor="middle">lt</text>
<text x="700.0" y="82" font-size="11" fill="#1565c0" text-anchor="middle">&lt; (davor)</text>
<text x="1020.0" y="65" font-size="16" font-weight="700" fill="#1565c0" text-anchor="middle">eb</text>
<text x="1020.0" y="82" font-size="11" fill="#1565c0" text-anchor="middle">ends before (strikt davor)</text>
<text x="200" y="159.0" font-size="16" font-weight="700" fill="#2e7d32" text-anchor="end">ge</text>
<text x="200" y="177.0" font-size="11" fill="#2e7d32" text-anchor="end">≥ (ab einschl.)</text>
<text x="200" y="309.0" font-size="16" font-weight="700" fill="#2e7d32" text-anchor="end">gt</text>
<text x="200" y="327.0" font-size="11" fill="#2e7d32" text-anchor="end">&gt; (danach)</text>
<text x="200" y="459.0" font-size="16" font-weight="700" fill="#2e7d32" text-anchor="end">sa</text>
<text x="200" y="477.0" font-size="11" fill="#2e7d32" text-anchor="end">starts after (strikt danach)</text>
<rect x="226" y="96" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="341.6" y="174.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="240" y1="183.0" x2="520" y2="183.0" stroke="#333" stroke-width="1.5"/>
<line x1="341.6" y1="170.0" x2="341.6" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<line x1="418.4" y1="170.0" x2="418.4" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<text x="380.0" y="226" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge...&amp;date=le...</text>
<text x="380.0" y="210" font-size="11" fill="#555" text-anchor="middle">geschl. / geschl.</text>
<rect x="546" y="96" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="661.6" y="174.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="560" y1="183.0" x2="840" y2="183.0" stroke="#333" stroke-width="1.5"/>
<line x1="661.6" y1="170.0" x2="661.6" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<line x1="738.4" y1="170.0" x2="738.4" y2="196.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="700.0" y="226" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge...&amp;date=lt...</text>
<text x="700.0" y="210" font-size="11" fill="#555" text-anchor="middle">geschl. / offen</text>
<rect x="866" y="96" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="981.6" y="174.0" width="76.80000000000007" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="880" y1="183.0" x2="1160" y2="183.0" stroke="#333" stroke-width="1.5"/>
<line x1="981.6" y1="170.0" x2="981.6" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<line x1="1058.4" y1="170.0" x2="1058.4" y2="196.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="1020.0" y="226" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge...&amp;date=eb...</text>
<text x="1020.0" y="210" font-size="11" fill="#555" text-anchor="middle">geschl. / offen</text>
<rect x="226" y="246" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="341.6" y="324.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="240" y1="333.0" x2="520" y2="333.0" stroke="#333" stroke-width="1.5"/>
<line x1="341.6" y1="320.0" x2="341.6" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="418.4" y1="320.0" x2="418.4" y2="346.0" stroke="#c62828" stroke-width="2.5" />
<text x="380.0" y="376" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt...&amp;date=le...</text>
<text x="380.0" y="360" font-size="11" fill="#555" text-anchor="middle">offen / geschl.</text>
<rect x="546" y="246" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="661.6" y="324.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="560" y1="333.0" x2="840" y2="333.0" stroke="#333" stroke-width="1.5"/>
<line x1="661.6" y1="320.0" x2="661.6" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="738.4" y1="320.0" x2="738.4" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="700.0" y="376" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt...&amp;date=lt...</text>
<text x="700.0" y="360" font-size="11" fill="#555" text-anchor="middle">offen / offen</text>
<rect x="866" y="246" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="981.6" y="324.0" width="76.80000000000007" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="880" y1="333.0" x2="1160" y2="333.0" stroke="#333" stroke-width="1.5"/>
<line x1="981.6" y1="320.0" x2="981.6" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="1058.4" y1="320.0" x2="1058.4" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="1020.0" y="376" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt...&amp;date=eb...</text>
<text x="1020.0" y="360" font-size="11" fill="#555" text-anchor="middle">offen / offen</text>
<rect x="226" y="396" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="341.6" y="474.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="240" y1="483.0" x2="520" y2="483.0" stroke="#333" stroke-width="1.5"/>
<line x1="341.6" y1="470.0" x2="341.6" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="418.4" y1="470.0" x2="418.4" y2="496.0" stroke="#c62828" stroke-width="2.5" />
<text x="380.0" y="526" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa...&amp;date=le...</text>
<text x="380.0" y="510" font-size="11" fill="#555" text-anchor="middle">offen / geschl.</text>
<rect x="546" y="396" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="661.6" y="474.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="560" y1="483.0" x2="840" y2="483.0" stroke="#333" stroke-width="1.5"/>
<line x1="661.6" y1="470.0" x2="661.6" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="738.4" y1="470.0" x2="738.4" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="700.0" y="526" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa...&amp;date=lt...</text>
<text x="700.0" y="510" font-size="11" fill="#555" text-anchor="middle">offen / offen</text>
<rect x="866" y="396" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="981.6" y="474.0" width="76.80000000000007" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="880" y1="483.0" x2="1160" y2="483.0" stroke="#333" stroke-width="1.5"/>
<line x1="981.6" y1="470.0" x2="981.6" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="1058.4" y1="470.0" x2="1058.4" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="1020.0" y="526" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa...&amp;date=eb...</text>
<text x="1020.0" y="510" font-size="11" fill="#555" text-anchor="middle">offen / offen</text>
<text x="220" y="572" font-size="12" fill="#444" font-style="italic">Gestrichelte Grenze = exklusiv (Wert selbst nicht im Treffer) | Durchgezogene Grenze = inklusiv</text>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

@@ -0,0 +1,92 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1100" height="590" viewBox="0 0 1100 590" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#fafafa"] { fill: #2a2a2a; }
[stroke="#ddd"] { stroke: #484848; }
[fill="#2e7d32"] { fill: #66bb6a; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
[fill="#6a1b9a"] { fill: #ba68c8; }
}
</style>
<text x="550.0" y="24" font-size="14" fill="#555" text-anchor="middle">Each cell = a valid combination of two date parameters (e.g. date=ge...&amp;date=le...)</text>
<text x="380.0" y="65" font-size="16" font-weight="700" fill="#1565c0" text-anchor="middle">le</text>
<text x="380.0" y="82" font-size="11" fill="#1565c0" text-anchor="middle">≤ (until, incl.)</text>
<text x="700.0" y="65" font-size="16" font-weight="700" fill="#1565c0" text-anchor="middle">lt</text>
<text x="700.0" y="82" font-size="11" fill="#1565c0" text-anchor="middle">&lt; (before)</text>
<text x="1020.0" y="65" font-size="16" font-weight="700" fill="#1565c0" text-anchor="middle">eb</text>
<text x="1020.0" y="82" font-size="11" fill="#1565c0" text-anchor="middle">ends before (strictly before)</text>
<text x="200" y="159.0" font-size="16" font-weight="700" fill="#2e7d32" text-anchor="end">ge</text>
<text x="200" y="177.0" font-size="11" fill="#2e7d32" text-anchor="end">≥ (from, incl.)</text>
<text x="200" y="309.0" font-size="16" font-weight="700" fill="#2e7d32" text-anchor="end">gt</text>
<text x="200" y="327.0" font-size="11" fill="#2e7d32" text-anchor="end">&gt; (after)</text>
<text x="200" y="459.0" font-size="16" font-weight="700" fill="#2e7d32" text-anchor="end">sa</text>
<text x="200" y="477.0" font-size="11" fill="#2e7d32" text-anchor="end">starts after (strictly after)</text>
<rect x="226" y="96" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="341.6" y="174.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="240" y1="183.0" x2="520" y2="183.0" stroke="#333" stroke-width="1.5"/>
<line x1="341.6" y1="170.0" x2="341.6" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<line x1="418.4" y1="170.0" x2="418.4" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<text x="380.0" y="226" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge...&amp;date=le...</text>
<text x="380.0" y="210" font-size="11" fill="#555" text-anchor="middle">closed / closed</text>
<rect x="546" y="96" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="661.6" y="174.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="560" y1="183.0" x2="840" y2="183.0" stroke="#333" stroke-width="1.5"/>
<line x1="661.6" y1="170.0" x2="661.6" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<line x1="738.4" y1="170.0" x2="738.4" y2="196.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="700.0" y="226" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge...&amp;date=lt...</text>
<text x="700.0" y="210" font-size="11" fill="#555" text-anchor="middle">closed / open</text>
<rect x="866" y="96" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="981.6" y="174.0" width="76.80000000000007" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="880" y1="183.0" x2="1160" y2="183.0" stroke="#333" stroke-width="1.5"/>
<line x1="981.6" y1="170.0" x2="981.6" y2="196.0" stroke="#c62828" stroke-width="2.5" />
<line x1="1058.4" y1="170.0" x2="1058.4" y2="196.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="1020.0" y="226" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=ge...&amp;date=eb...</text>
<text x="1020.0" y="210" font-size="11" fill="#555" text-anchor="middle">closed / open</text>
<rect x="226" y="246" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="341.6" y="324.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="240" y1="333.0" x2="520" y2="333.0" stroke="#333" stroke-width="1.5"/>
<line x1="341.6" y1="320.0" x2="341.6" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="418.4" y1="320.0" x2="418.4" y2="346.0" stroke="#c62828" stroke-width="2.5" />
<text x="380.0" y="376" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt...&amp;date=le...</text>
<text x="380.0" y="360" font-size="11" fill="#555" text-anchor="middle">open / closed</text>
<rect x="546" y="246" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="661.6" y="324.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="560" y1="333.0" x2="840" y2="333.0" stroke="#333" stroke-width="1.5"/>
<line x1="661.6" y1="320.0" x2="661.6" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="738.4" y1="320.0" x2="738.4" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="700.0" y="376" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt...&amp;date=lt...</text>
<text x="700.0" y="360" font-size="11" fill="#555" text-anchor="middle">open / open</text>
<rect x="866" y="246" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="981.6" y="324.0" width="76.80000000000007" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="880" y1="333.0" x2="1160" y2="333.0" stroke="#333" stroke-width="1.5"/>
<line x1="981.6" y1="320.0" x2="981.6" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="1058.4" y1="320.0" x2="1058.4" y2="346.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="1020.0" y="376" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=gt...&amp;date=eb...</text>
<text x="1020.0" y="360" font-size="11" fill="#555" text-anchor="middle">open / open</text>
<rect x="226" y="396" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="341.6" y="474.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="240" y1="483.0" x2="520" y2="483.0" stroke="#333" stroke-width="1.5"/>
<line x1="341.6" y1="470.0" x2="341.6" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="418.4" y1="470.0" x2="418.4" y2="496.0" stroke="#c62828" stroke-width="2.5" />
<text x="380.0" y="526" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa...&amp;date=le...</text>
<text x="380.0" y="510" font-size="11" fill="#555" text-anchor="middle">open / closed</text>
<rect x="546" y="396" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="661.6" y="474.0" width="76.79999999999995" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="560" y1="483.0" x2="840" y2="483.0" stroke="#333" stroke-width="1.5"/>
<line x1="661.6" y1="470.0" x2="661.6" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="738.4" y1="470.0" x2="738.4" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="700.0" y="526" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa...&amp;date=lt...</text>
<text x="700.0" y="510" font-size="11" fill="#555" text-anchor="middle">open / open</text>
<rect x="866" y="396" width="308" height="138" fill="#fafafa" stroke="#ddd" stroke-width="1" rx="6"/>
<rect x="981.6" y="474.0" width="76.80000000000007" height="18" fill="#2e7d32" opacity="0.25"/>
<line x1="880" y1="483.0" x2="1160" y2="483.0" stroke="#333" stroke-width="1.5"/>
<line x1="981.6" y1="470.0" x2="981.6" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<line x1="1058.4" y1="470.0" x2="1058.4" y2="496.0" stroke="#c62828" stroke-width="2.5" stroke-dasharray="4,3"/>
<text x="1020.0" y="526" font-size="11.5" fill="#6a1b9a" text-anchor="middle" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=sa...&amp;date=eb...</text>
<text x="1020.0" y="510" font-size="11" fill="#555" text-anchor="middle">open / open</text>
<text x="220" y="572" font-size="12" fill="#444" font-style="italic">Dashed boundary = exclusive (value itself not included) | Solid boundary = inclusive</text>
</svg>

After

Width:  |  Height:  |  Size: 9.1 KiB

+40
View File
@@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="286" viewBox="0 0 1000 286" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#888"] { fill: #b0b0b0; }
[fill="#2e7d32"] { fill: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
[fill="#6a1b9a"] { fill: #ba68c8; }
}
</style>
<text x="500.0" y="24" font-size="15" fill="#555" text-anchor="middle">Ohne Praefix wird 'eq' angenommen -- die Genauigkeit (Precision) des Suchwerts bestimmt das Intervall</text>
<text x="60" y="64" font-size="15" font-weight="700" fill="#111">Suchwert mit Tages-Genauigkeit</text>
<text x="940" y="64" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=2023-06-15</text>
<rect x="475.0" y="91" width="50.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="101" x2="940" y2="101" stroke="#333" stroke-width="2"/>
<polygon points="940,101 932,96 932,106" fill="#333"/>
<text x="940" y="129" font-size="11" fill="#888" text-anchor="end">Zukunft →</text>
<text x="60" y="129" font-size="11" fill="#888" text-anchor="start">← Vergangenheit</text>
<line x1="500.0" y1="77" x2="500.0" y2="125" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="101" r="4.5" fill="#c62828"/>
<text x="500.0" y="71" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="147" font-size="12" fill="#444" font-style="italic">Intervall = genau dieser Tag (00:00-24:00). Resource-Datum muss vollstaendig in diesem Intervall liegen.</text>
<text x="60" y="174" font-size="15" font-weight="700" fill="#111">Suchwert mit Monats-Genauigkeit</text>
<text x="940" y="174" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=2023-06</text>
<rect x="410.0" y="201" width="180.0" height="20" fill="#1565c0" opacity="0.22"/>
<line x1="60" y1="211" x2="940" y2="211" stroke="#333" stroke-width="2"/>
<polygon points="940,211 932,206 932,216" fill="#333"/>
<text x="940" y="239" font-size="11" fill="#888" text-anchor="end">Zukunft →</text>
<text x="60" y="239" font-size="11" fill="#888" text-anchor="start">← Vergangenheit</text>
<line x1="500.0" y1="187" x2="500.0" y2="235" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="211" r="4.5" fill="#c62828"/>
<text x="500.0" y="181" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">Juni 2023</text>
<text x="60" y="257" font-size="12" fill="#444" font-style="italic">Intervall = ganzer Monat (2023-06-01 00:00 bis 2023-07-01 00:00). Je groeber die Precision, desto breiter das Intervall.</text>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

+40
View File
@@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="286" viewBox="0 0 1000 286" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#888"] { fill: #b0b0b0; }
[fill="#2e7d32"] { fill: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[stroke="#c62828"] { stroke: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
[fill="#6a1b9a"] { fill: #ba68c8; }
}
</style>
<text x="500.0" y="24" font-size="15" fill="#555" text-anchor="middle">Without a prefix, 'eq' is assumed -- the precision of the search value determines the interval</text>
<text x="60" y="64" font-size="15" font-weight="700" fill="#111">Search value with day precision</text>
<text x="940" y="64" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=2023-06-15</text>
<rect x="475.0" y="91" width="50.0" height="20" fill="#2e7d32" opacity="0.22"/>
<line x1="60" y1="101" x2="940" y2="101" stroke="#333" stroke-width="2"/>
<polygon points="940,101 932,96 932,106" fill="#333"/>
<text x="940" y="129" font-size="11" fill="#888" text-anchor="end">Future →</text>
<text x="60" y="129" font-size="11" fill="#888" text-anchor="start">← Past</text>
<line x1="500.0" y1="77" x2="500.0" y2="125" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="101" r="4.5" fill="#c62828"/>
<text x="500.0" y="71" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">2023-06-15</text>
<text x="60" y="147" font-size="12" fill="#444" font-style="italic">Interval = exactly this day (00:00-24:00). The resource date must lie fully within this interval.</text>
<text x="60" y="174" font-size="15" font-weight="700" fill="#111">Search value with month precision</text>
<text x="940" y="174" font-size="13" fill="#6a1b9a" text-anchor="end" font-family="Latin Modern Mono, CMU Typewriter Text, Computer Modern Typewriter, Consolas, Menlo, monospace">date=2023-06</text>
<rect x="410.0" y="201" width="180.0" height="20" fill="#1565c0" opacity="0.22"/>
<line x1="60" y1="211" x2="940" y2="211" stroke="#333" stroke-width="2"/>
<polygon points="940,211 932,206 932,216" fill="#333"/>
<text x="940" y="239" font-size="11" fill="#888" text-anchor="end">Future →</text>
<text x="60" y="239" font-size="11" fill="#888" text-anchor="start">← Past</text>
<line x1="500.0" y1="187" x2="500.0" y2="235" stroke="#c62828" stroke-width="2" stroke-dasharray="5,3"/>
<circle cx="500.0" cy="211" r="4.5" fill="#c62828"/>
<text x="500.0" y="181" font-size="12" fill="#c62828" text-anchor="middle" font-weight="600">June 2023</text>
<text x="60" y="257" font-size="12" fill="#444" font-style="italic">Interval = entire month (2023-06-01 00:00 to 2023-07-01 00:00). The coarser the precision, the wider the interval.</text>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,111 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1160" height="754" viewBox="0 0 1160 754" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#777"] { fill: #aeaeae; }
[stroke="#eee"] { stroke: #3a3a3a; }
[stroke="#ffffff"] { stroke: #121212; }
[fill="#2e7d32"] { fill: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
}
</style>
<text x="550.0" y="24" font-size="14" fill="#555" text-anchor="middle">Fehlender Start = -unendlich | Fehlendes Ende = +unendlich | Pfeilspitze = offenes Ende</text>
<text x="550.0" y="44" font-size="12.5" fill="#777" text-anchor="middle">Suchwert: date=&amp;lt;praefix&amp;gt;2023-06-15 | Gruen = Treffer, Rot = kein Treffer</text>
<text x="30" y="74" font-size="20" font-weight="700" fill="#111">gt</text>
<text x="180" y="74" font-size="12.5" fill="#555">Fehlendes Ende = +unendlich -&gt; ueberlappt fast immer den oberen Bereich.</text>
<rect x="700.0" y="90" width="360.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="100" x2="1060" y2="100" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,100 1053,96 1053,104" fill="#333"/>
<line x1="700.0" y1="100" x2="700.0" y2="206" stroke="#333" stroke-width="2" />
<text x="700.0" y="90" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="660.0" y="118" width="364.0" height="16" fill="#2e7d32"/>
<rect x="660.0" y="118" width="10" height="16" rx="4" fill="#2e7d32"/>
<polygon points="1040,126 1024,118 1024,134" fill="#2e7d32"/>
<text x="246" y="130" font-size="11.5" fill="#333" text-anchor="end">Period D: nur Start (laeuft noch)</text>
<path d="M 1074 126 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="152" width="394.0" height="16" fill="#c62828"/>
<polygon points="280,160 296,152 296,168" fill="#c62828"/>
<rect x="680.0" y="152" width="10" height="16" rx="4" fill="#c62828"/>
<text x="246" y="164" font-size="11.5" fill="#333" text-anchor="end">Period E: nur Ende (Start unbekannt)</text>
<line x1="1075" y1="153" x2="1089" y2="167" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="167" x2="1089" y2="153" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="186" width="728" height="16" fill="#2e7d32"/>
<polygon points="280,194 296,186 296,202" fill="#2e7d32"/>
<polygon points="1040,194 1024,186 1024,202" fill="#2e7d32"/>
<text x="246" y="198" font-size="11.5" fill="#333" text-anchor="end">Period F: weder Start noch Ende bekannt</text>
<path d="M 1074 194 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<line x1="30" y1="214" x2="1130" y2="214" stroke="#eee" stroke-width="1"/>
<text x="30" y="236" font-size="20" font-weight="700" fill="#111">sa</text>
<text x="180" y="236" font-size="12.5" fill="#555">Fehlender Start = -unendlich -&gt; kann NIE vollstaendig 'danach' liegen.</text>
<rect x="700.0" y="252" width="360.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="262" x2="1060" y2="262" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,262 1053,258 1053,266" fill="#333"/>
<line x1="700.0" y1="262" x2="700.0" y2="368" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="700.0" y="252" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="660.0" y="280" width="364.0" height="16" fill="#c62828"/>
<rect x="660.0" y="280" width="10" height="16" rx="4" fill="#c62828"/>
<polygon points="1040,288 1024,280 1024,296" fill="#c62828"/>
<text x="246" y="292" font-size="11.5" fill="#333" text-anchor="end">Period D: nur Start (laeuft noch)</text>
<line x1="1075" y1="281" x2="1089" y2="295" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="295" x2="1089" y2="281" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="314" width="394.0" height="16" fill="#c62828"/>
<polygon points="280,322 296,314 296,330" fill="#c62828"/>
<rect x="680.0" y="314" width="10" height="16" rx="4" fill="#c62828"/>
<text x="246" y="326" font-size="11.5" fill="#333" text-anchor="end">Period E: nur Ende (Start unbekannt)</text>
<line x1="1075" y1="315" x2="1089" y2="329" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="329" x2="1089" y2="315" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="348" width="728" height="16" fill="#c62828"/>
<polygon points="280,356 296,348 296,364" fill="#c62828"/>
<polygon points="1040,356 1024,348 1024,364" fill="#c62828"/>
<text x="246" y="360" font-size="11.5" fill="#333" text-anchor="end">Period F: weder Start noch Ende bekannt</text>
<line x1="1075" y1="349" x2="1089" y2="363" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="363" x2="1089" y2="349" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<line x1="30" y1="376" x2="1130" y2="376" stroke="#eee" stroke-width="1"/>
<text x="30" y="398" font-size="20" font-weight="700" fill="#111">lt</text>
<text x="180" y="398" font-size="12.5" fill="#555">Fehlender Start = -unendlich -&gt; ueberlappt fast immer den unteren Bereich.</text>
<rect x="260" y="414" width="440.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="424" x2="1060" y2="424" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,424 1053,420 1053,428" fill="#333"/>
<line x1="700.0" y1="424" x2="700.0" y2="530" stroke="#333" stroke-width="2" />
<text x="700.0" y="414" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="660.0" y="442" width="364.0" height="16" fill="#2e7d32"/>
<rect x="660.0" y="442" width="10" height="16" rx="4" fill="#2e7d32"/>
<polygon points="1040,450 1024,442 1024,458" fill="#2e7d32"/>
<text x="246" y="454" font-size="11.5" fill="#333" text-anchor="end">Period D: nur Start (laeuft noch)</text>
<path d="M 1074 450 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="476" width="394.0" height="16" fill="#2e7d32"/>
<polygon points="280,484 296,476 296,492" fill="#2e7d32"/>
<rect x="680.0" y="476" width="10" height="16" rx="4" fill="#2e7d32"/>
<text x="246" y="488" font-size="11.5" fill="#333" text-anchor="end">Period E: nur Ende (Start unbekannt)</text>
<path d="M 1074 484 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="510" width="728" height="16" fill="#2e7d32"/>
<polygon points="280,518 296,510 296,526" fill="#2e7d32"/>
<polygon points="1040,518 1024,510 1024,526" fill="#2e7d32"/>
<text x="246" y="522" font-size="11.5" fill="#333" text-anchor="end">Period F: weder Start noch Ende bekannt</text>
<path d="M 1074 518 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<line x1="30" y1="538" x2="1130" y2="538" stroke="#eee" stroke-width="1"/>
<text x="30" y="560" font-size="20" font-weight="700" fill="#111">eb</text>
<text x="180" y="560" font-size="12.5" fill="#555">Fehlendes Ende = +unendlich -&gt; kann NIE vollstaendig 'davor' liegen.</text>
<rect x="260" y="576" width="440.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="586" x2="1060" y2="586" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,586 1053,582 1053,590" fill="#333"/>
<line x1="700.0" y1="586" x2="700.0" y2="692" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="700.0" y="576" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="660.0" y="604" width="364.0" height="16" fill="#c62828"/>
<rect x="660.0" y="604" width="10" height="16" rx="4" fill="#c62828"/>
<polygon points="1040,612 1024,604 1024,620" fill="#c62828"/>
<text x="246" y="616" font-size="11.5" fill="#333" text-anchor="end">Period D: nur Start (laeuft noch)</text>
<line x1="1075" y1="605" x2="1089" y2="619" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="619" x2="1089" y2="605" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="638" width="394.0" height="16" fill="#2e7d32"/>
<polygon points="280,646 296,638 296,654" fill="#2e7d32"/>
<rect x="680.0" y="638" width="10" height="16" rx="4" fill="#2e7d32"/>
<text x="246" y="650" font-size="11.5" fill="#333" text-anchor="end">Period E: nur Ende (Start unbekannt)</text>
<path d="M 1074 646 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="672" width="728" height="16" fill="#c62828"/>
<polygon points="280,680 296,672 296,688" fill="#c62828"/>
<polygon points="1040,680 1024,672 1024,688" fill="#c62828"/>
<text x="246" y="684" font-size="11.5" fill="#333" text-anchor="end">Period F: weder Start noch Ende bekannt</text>
<line x1="1075" y1="673" x2="1089" y2="687" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="687" x2="1089" y2="673" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="30" y="722" width="18" height="14" rx="3" fill="#2e7d32"/><text x="54" y="734" font-size="12.5" fill="#333">Treffer</text>
<rect x="130" y="722" width="18" height="14" rx="3" fill="#c62828"/><text x="154" y="734" font-size="12.5" fill="#333">kein Treffer</text>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

@@ -0,0 +1,111 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1160" height="754" viewBox="0 0 1160 754" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#555"] { fill: #c2c2c2; }
[fill="#777"] { fill: #aeaeae; }
[stroke="#eee"] { stroke: #3a3a3a; }
[stroke="#ffffff"] { stroke: #121212; }
[fill="#2e7d32"] { fill: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
}
</style>
<text x="550.0" y="24" font-size="14" fill="#555" text-anchor="middle">Missing start = -infinity | Missing end = +infinity | Arrowhead = open end</text>
<text x="550.0" y="44" font-size="12.5" fill="#777" text-anchor="middle">Search value: date=&amp;lt;prefix&amp;gt;2023-06-15 | Green = match, Red = no match</text>
<text x="30" y="74" font-size="20" font-weight="700" fill="#111">gt</text>
<text x="180" y="74" font-size="12.5" fill="#555">Missing end = +infinity -&gt; almost always overlaps the upper range.</text>
<rect x="700.0" y="90" width="360.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="100" x2="1060" y2="100" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,100 1053,96 1053,104" fill="#333"/>
<line x1="700.0" y1="100" x2="700.0" y2="206" stroke="#333" stroke-width="2" />
<text x="700.0" y="90" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="660.0" y="118" width="364.0" height="16" fill="#2e7d32"/>
<rect x="660.0" y="118" width="10" height="16" rx="4" fill="#2e7d32"/>
<polygon points="1040,126 1024,118 1024,134" fill="#2e7d32"/>
<text x="246" y="130" font-size="11.5" fill="#333" text-anchor="end">Period D: start only (ongoing)</text>
<path d="M 1074 126 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="152" width="394.0" height="16" fill="#c62828"/>
<polygon points="280,160 296,152 296,168" fill="#c62828"/>
<rect x="680.0" y="152" width="10" height="16" rx="4" fill="#c62828"/>
<text x="246" y="164" font-size="11.5" fill="#333" text-anchor="end">Period E: end only (start unknown)</text>
<line x1="1075" y1="153" x2="1089" y2="167" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="167" x2="1089" y2="153" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="186" width="728" height="16" fill="#2e7d32"/>
<polygon points="280,194 296,186 296,202" fill="#2e7d32"/>
<polygon points="1040,194 1024,186 1024,202" fill="#2e7d32"/>
<text x="246" y="198" font-size="11.5" fill="#333" text-anchor="end">Period F: neither start nor end known</text>
<path d="M 1074 194 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<line x1="30" y1="214" x2="1130" y2="214" stroke="#eee" stroke-width="1"/>
<text x="30" y="236" font-size="20" font-weight="700" fill="#111">sa</text>
<text x="180" y="236" font-size="12.5" fill="#555">Missing start = -infinity -&gt; can NEVER lie entirely 'after'.</text>
<rect x="700.0" y="252" width="360.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="262" x2="1060" y2="262" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,262 1053,258 1053,266" fill="#333"/>
<line x1="700.0" y1="262" x2="700.0" y2="368" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="700.0" y="252" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="660.0" y="280" width="364.0" height="16" fill="#c62828"/>
<rect x="660.0" y="280" width="10" height="16" rx="4" fill="#c62828"/>
<polygon points="1040,288 1024,280 1024,296" fill="#c62828"/>
<text x="246" y="292" font-size="11.5" fill="#333" text-anchor="end">Period D: start only (ongoing)</text>
<line x1="1075" y1="281" x2="1089" y2="295" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="295" x2="1089" y2="281" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="314" width="394.0" height="16" fill="#c62828"/>
<polygon points="280,322 296,314 296,330" fill="#c62828"/>
<rect x="680.0" y="314" width="10" height="16" rx="4" fill="#c62828"/>
<text x="246" y="326" font-size="11.5" fill="#333" text-anchor="end">Period E: end only (start unknown)</text>
<line x1="1075" y1="315" x2="1089" y2="329" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="329" x2="1089" y2="315" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="348" width="728" height="16" fill="#c62828"/>
<polygon points="280,356 296,348 296,364" fill="#c62828"/>
<polygon points="1040,356 1024,348 1024,364" fill="#c62828"/>
<text x="246" y="360" font-size="11.5" fill="#333" text-anchor="end">Period F: neither start nor end known</text>
<line x1="1075" y1="349" x2="1089" y2="363" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="363" x2="1089" y2="349" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<line x1="30" y1="376" x2="1130" y2="376" stroke="#eee" stroke-width="1"/>
<text x="30" y="398" font-size="20" font-weight="700" fill="#111">lt</text>
<text x="180" y="398" font-size="12.5" fill="#555">Missing start = -infinity -&gt; almost always overlaps the lower range.</text>
<rect x="260" y="414" width="440.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="424" x2="1060" y2="424" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,424 1053,420 1053,428" fill="#333"/>
<line x1="700.0" y1="424" x2="700.0" y2="530" stroke="#333" stroke-width="2" />
<text x="700.0" y="414" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="660.0" y="442" width="364.0" height="16" fill="#2e7d32"/>
<rect x="660.0" y="442" width="10" height="16" rx="4" fill="#2e7d32"/>
<polygon points="1040,450 1024,442 1024,458" fill="#2e7d32"/>
<text x="246" y="454" font-size="11.5" fill="#333" text-anchor="end">Period D: start only (ongoing)</text>
<path d="M 1074 450 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="476" width="394.0" height="16" fill="#2e7d32"/>
<polygon points="280,484 296,476 296,492" fill="#2e7d32"/>
<rect x="680.0" y="476" width="10" height="16" rx="4" fill="#2e7d32"/>
<text x="246" y="488" font-size="11.5" fill="#333" text-anchor="end">Period E: end only (start unknown)</text>
<path d="M 1074 484 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="510" width="728" height="16" fill="#2e7d32"/>
<polygon points="280,518 296,510 296,526" fill="#2e7d32"/>
<polygon points="1040,518 1024,510 1024,526" fill="#2e7d32"/>
<text x="246" y="522" font-size="11.5" fill="#333" text-anchor="end">Period F: neither start nor end known</text>
<path d="M 1074 518 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<line x1="30" y1="538" x2="1130" y2="538" stroke="#eee" stroke-width="1"/>
<text x="30" y="560" font-size="20" font-weight="700" fill="#111">eb</text>
<text x="180" y="560" font-size="12.5" fill="#555">Missing end = +infinity -&gt; can NEVER lie entirely 'before'.</text>
<rect x="260" y="576" width="440.0" height="124" fill="#1565c0" opacity="0.07"/>
<line x1="260" y1="586" x2="1060" y2="586" stroke="#333" stroke-width="1.5"/>
<polygon points="1060,586 1053,582 1053,590" fill="#333"/>
<line x1="700.0" y1="586" x2="700.0" y2="692" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="700.0" y="576" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="660.0" y="604" width="364.0" height="16" fill="#c62828"/>
<rect x="660.0" y="604" width="10" height="16" rx="4" fill="#c62828"/>
<polygon points="1040,612 1024,604 1024,620" fill="#c62828"/>
<text x="246" y="616" font-size="11.5" fill="#333" text-anchor="end">Period D: start only (ongoing)</text>
<line x1="1075" y1="605" x2="1089" y2="619" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="619" x2="1089" y2="605" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="296" y="638" width="394.0" height="16" fill="#2e7d32"/>
<polygon points="280,646 296,638 296,654" fill="#2e7d32"/>
<rect x="680.0" y="638" width="10" height="16" rx="4" fill="#2e7d32"/>
<text x="246" y="650" font-size="11.5" fill="#333" text-anchor="end">Period E: end only (start unknown)</text>
<path d="M 1074 646 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="296" y="672" width="728" height="16" fill="#c62828"/>
<polygon points="280,680 296,672 296,688" fill="#c62828"/>
<polygon points="1040,680 1024,672 1024,688" fill="#c62828"/>
<text x="246" y="684" font-size="11.5" fill="#333" text-anchor="end">Period F: neither start nor end known</text>
<line x1="1075" y1="673" x2="1089" y2="687" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="1075" y1="687" x2="1089" y2="673" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<rect x="30" y="722" width="18" height="14" rx="3" fill="#2e7d32"/><text x="54" y="734" font-size="12.5" fill="#333">Match</text>
<rect x="130" y="722" width="18" height="14" rx="3" fill="#c62828"/><text x="154" y="734" font-size="12.5" fill="#333">No match</text>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

@@ -0,0 +1,84 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="756" viewBox="0 0 1000 756" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[stroke="#eee"] { stroke: #3a3a3a; }
[stroke="#ffffff"] { stroke: #121212; }
[fill="#2e7d32"] { fill: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
}
</style>
<text x="500.0" y="24" font-size="14" fill="#555" text-anchor="middle">Suchwert: date=&amp;lt;praefix&amp;gt;2023-06-15 | Gruen = Treffer, Rot = kein Treffer</text>
<text x="60" y="56" font-size="20" font-weight="700" fill="#111">gt</text>
<text x="60" y="76" font-size="12.5" fill="#555">Overlap genuegt: Period muss nur ueber die Grenze hinausragen.</text>
<rect x="544.0" y="84" width="396.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="92" x2="940" y2="92" stroke="#333" stroke-width="1.5"/>
<polygon points="940,92 933,88 933,96" fill="#333"/>
<line x1="544.0" y1="72" x2="544.0" y2="112" stroke="#333" stroke-width="2" />
<text x="544.0" y="66" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="100" y="113" width="354.0" height="18" rx="4" fill="#c62828"/>
<line x1="270.0" y1="115" x2="284.0" y2="129" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="270.0" y1="129" x2="284.0" y2="115" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="277.0" y="154" font-size="11" fill="#444" text-anchor="middle">Period A: komplett davor</text>
<rect x="454.0" y="113" width="160.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 526.0 122 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="534.0" y="154" font-size="11" fill="#444" text-anchor="middle">Period B: ueberlappt Grenze</text>
<rect x="614.0" y="113" width="286.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 749.0 122 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="757.0" y="154" font-size="11" fill="#444" text-anchor="middle">Period C: komplett danach</text>
<text x="60" y="226" font-size="20" font-weight="700" fill="#111">sa</text>
<text x="60" y="246" font-size="12.5" fill="#555">Vollstaendige Trennung noetig: Period muss komplett hinter der Grenze liegen.</text>
<rect x="544.0" y="254" width="396.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="262" x2="940" y2="262" stroke="#333" stroke-width="1.5"/>
<polygon points="940,262 933,258 933,266" fill="#333"/>
<line x1="544.0" y1="242" x2="544.0" y2="282" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="544.0" y="236" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="100" y="283" width="354.0" height="18" rx="4" fill="#c62828"/>
<line x1="270.0" y1="285" x2="284.0" y2="299" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="270.0" y1="299" x2="284.0" y2="285" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="277.0" y="324" font-size="11" fill="#444" text-anchor="middle">Period A: komplett davor</text>
<rect x="454.0" y="283" width="160.0" height="18" rx="4" fill="#c62828"/>
<line x1="527.0" y1="285" x2="541.0" y2="299" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="527.0" y1="299" x2="541.0" y2="285" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="534.0" y="324" font-size="11" fill="#444" text-anchor="middle">Period B: ueberlappt Grenze</text>
<rect x="614.0" y="283" width="286.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 749.0 292 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="757.0" y="324" font-size="11" fill="#444" text-anchor="middle">Period C: komplett danach</text>
<line x1="30" y1="361" x2="940" y2="361" stroke="#eee" stroke-width="1"/>
<text x="60" y="396" font-size="20" font-weight="700" fill="#111">lt</text>
<text x="60" y="416" font-size="12.5" fill="#555">Overlap genuegt: Period muss nur vor die Grenze hineinragen.</text>
<rect x="60" y="424" width="484.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="432" x2="940" y2="432" stroke="#333" stroke-width="1.5"/>
<polygon points="940,432 933,428 933,436" fill="#333"/>
<line x1="544.0" y1="412" x2="544.0" y2="452" stroke="#333" stroke-width="2" />
<text x="544.0" y="406" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="100" y="453" width="354.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 269.0 462 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="277.0" y="494" font-size="11" fill="#444" text-anchor="middle">Period A: komplett davor</text>
<rect x="454.0" y="453" width="160.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 526.0 462 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="534.0" y="494" font-size="11" fill="#444" text-anchor="middle">Period B: ueberlappt Grenze</text>
<rect x="614.0" y="453" width="286.0" height="18" rx="4" fill="#c62828"/>
<line x1="750.0" y1="455" x2="764.0" y2="469" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="750.0" y1="469" x2="764.0" y2="455" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="757.0" y="494" font-size="11" fill="#444" text-anchor="middle">Period C: komplett danach</text>
<text x="60" y="566" font-size="20" font-weight="700" fill="#111">eb</text>
<text x="60" y="586" font-size="12.5" fill="#555">Vollstaendige Trennung noetig: Period muss komplett vor der Grenze liegen.</text>
<rect x="60" y="594" width="484.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="602" x2="940" y2="602" stroke="#333" stroke-width="1.5"/>
<polygon points="940,602 933,598 933,606" fill="#333"/>
<line x1="544.0" y1="582" x2="544.0" y2="622" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="544.0" y="576" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Suchgrenze (2023-06-15)</text>
<rect x="100" y="623" width="354.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 269.0 632 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="277.0" y="664" font-size="11" fill="#444" text-anchor="middle">Period A: komplett davor</text>
<rect x="454.0" y="623" width="160.0" height="18" rx="4" fill="#c62828"/>
<line x1="527.0" y1="625" x2="541.0" y2="639" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="527.0" y1="639" x2="541.0" y2="625" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="534.0" y="664" font-size="11" fill="#444" text-anchor="middle">Period B: ueberlappt Grenze</text>
<rect x="614.0" y="623" width="286.0" height="18" rx="4" fill="#c62828"/>
<line x1="750.0" y1="625" x2="764.0" y2="639" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="750.0" y1="639" x2="764.0" y2="625" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="757.0" y="664" font-size="11" fill="#444" text-anchor="middle">Period C: komplett danach</text>
<rect x="30" y="724" width="18" height="14" rx="3" fill="#2e7d32"/><text x="54" y="736" font-size="12.5" fill="#333">Treffer</text>
<rect x="130" y="724" width="18" height="14" rx="3" fill="#c62828"/><text x="154" y="736" font-size="12.5" fill="#333">kein Treffer</text>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

@@ -0,0 +1,84 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="756" viewBox="0 0 1000 756" font-family="Latin Modern Roman, CMU Serif, Computer Modern Serif, Georgia, Times New Roman, serif">
<style>
@media (prefers-color-scheme: dark) {
[fill="#111"] { fill: #f2f2f2; }
[fill="#333"] { fill: #d6d6d6; }
[stroke="#333"] { stroke: #d6d6d6; }
[fill="#444"] { fill: #cfcfcf; }
[fill="#555"] { fill: #c2c2c2; }
[stroke="#eee"] { stroke: #3a3a3a; }
[stroke="#ffffff"] { stroke: #121212; }
[fill="#2e7d32"] { fill: #66bb6a; }
[fill="#c62828"] { fill: #ff6659; }
[fill="#1565c0"] { fill: #64b5f6; }
}
</style>
<text x="500.0" y="24" font-size="14" fill="#555" text-anchor="middle">Search value: date=&amp;lt;prefix&amp;gt;2023-06-15 | Green = match, Red = no match</text>
<text x="60" y="56" font-size="20" font-weight="700" fill="#111">gt</text>
<text x="60" y="76" font-size="12.5" fill="#555">Overlap suffices: the period only needs to extend past the boundary.</text>
<rect x="544.0" y="84" width="396.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="92" x2="940" y2="92" stroke="#333" stroke-width="1.5"/>
<polygon points="940,92 933,88 933,96" fill="#333"/>
<line x1="544.0" y1="72" x2="544.0" y2="112" stroke="#333" stroke-width="2" />
<text x="544.0" y="66" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="100" y="113" width="354.0" height="18" rx="4" fill="#c62828"/>
<line x1="270.0" y1="115" x2="284.0" y2="129" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="270.0" y1="129" x2="284.0" y2="115" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="277.0" y="154" font-size="11" fill="#444" text-anchor="middle">Period A: entirely before</text>
<rect x="454.0" y="113" width="160.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 526.0 122 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="534.0" y="154" font-size="11" fill="#444" text-anchor="middle">Period B: overlaps boundary</text>
<rect x="614.0" y="113" width="286.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 749.0 122 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="757.0" y="154" font-size="11" fill="#444" text-anchor="middle">Period C: entirely after</text>
<text x="60" y="226" font-size="20" font-weight="700" fill="#111">sa</text>
<text x="60" y="246" font-size="12.5" fill="#555">Full separation required: the period must lie entirely beyond the boundary.</text>
<rect x="544.0" y="254" width="396.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="262" x2="940" y2="262" stroke="#333" stroke-width="1.5"/>
<polygon points="940,262 933,258 933,266" fill="#333"/>
<line x1="544.0" y1="242" x2="544.0" y2="282" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="544.0" y="236" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="100" y="283" width="354.0" height="18" rx="4" fill="#c62828"/>
<line x1="270.0" y1="285" x2="284.0" y2="299" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="270.0" y1="299" x2="284.0" y2="285" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="277.0" y="324" font-size="11" fill="#444" text-anchor="middle">Period A: entirely before</text>
<rect x="454.0" y="283" width="160.0" height="18" rx="4" fill="#c62828"/>
<line x1="527.0" y1="285" x2="541.0" y2="299" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="527.0" y1="299" x2="541.0" y2="285" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="534.0" y="324" font-size="11" fill="#444" text-anchor="middle">Period B: overlaps boundary</text>
<rect x="614.0" y="283" width="286.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 749.0 292 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="757.0" y="324" font-size="11" fill="#444" text-anchor="middle">Period C: entirely after</text>
<line x1="30" y1="361" x2="940" y2="361" stroke="#eee" stroke-width="1"/>
<text x="60" y="396" font-size="20" font-weight="700" fill="#111">lt</text>
<text x="60" y="416" font-size="12.5" fill="#555">Overlap suffices: the period only needs to reach before the boundary.</text>
<rect x="60" y="424" width="484.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="432" x2="940" y2="432" stroke="#333" stroke-width="1.5"/>
<polygon points="940,432 933,428 933,436" fill="#333"/>
<line x1="544.0" y1="412" x2="544.0" y2="452" stroke="#333" stroke-width="2" />
<text x="544.0" y="406" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="100" y="453" width="354.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 269.0 462 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="277.0" y="494" font-size="11" fill="#444" text-anchor="middle">Period A: entirely before</text>
<rect x="454.0" y="453" width="160.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 526.0 462 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="534.0" y="494" font-size="11" fill="#444" text-anchor="middle">Period B: overlaps boundary</text>
<rect x="614.0" y="453" width="286.0" height="18" rx="4" fill="#c62828"/>
<line x1="750.0" y1="455" x2="764.0" y2="469" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="750.0" y1="469" x2="764.0" y2="455" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="757.0" y="494" font-size="11" fill="#444" text-anchor="middle">Period C: entirely after</text>
<text x="60" y="566" font-size="20" font-weight="700" fill="#111">eb</text>
<text x="60" y="586" font-size="12.5" fill="#555">Full separation required: the period must lie entirely before the boundary.</text>
<rect x="60" y="594" width="484.0" height="16" fill="#1565c0" opacity="0.10"/>
<line x1="60" y1="602" x2="940" y2="602" stroke="#333" stroke-width="1.5"/>
<polygon points="940,602 933,598 933,606" fill="#333"/>
<line x1="544.0" y1="582" x2="544.0" y2="622" stroke="#333" stroke-width="2" stroke-dasharray="4,4"/>
<text x="544.0" y="576" font-size="11.5" fill="#333" text-anchor="middle" font-weight="600">Search boundary (2023-06-15)</text>
<rect x="100" y="623" width="354.0" height="18" rx="4" fill="#2e7d32"/>
<path d="M 269.0 632 l 5 5 l 10 -11" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
<text x="277.0" y="664" font-size="11" fill="#444" text-anchor="middle">Period A: entirely before</text>
<rect x="454.0" y="623" width="160.0" height="18" rx="4" fill="#c62828"/>
<line x1="527.0" y1="625" x2="541.0" y2="639" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="527.0" y1="639" x2="541.0" y2="625" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="534.0" y="664" font-size="11" fill="#444" text-anchor="middle">Period B: overlaps boundary</text>
<rect x="614.0" y="623" width="286.0" height="18" rx="4" fill="#c62828"/>
<line x1="750.0" y1="625" x2="764.0" y2="639" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/><line x1="750.0" y1="639" x2="764.0" y2="625" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
<text x="757.0" y="664" font-size="11" fill="#444" text-anchor="middle">Period C: entirely after</text>
<rect x="30" y="724" width="18" height="14" rx="3" fill="#2e7d32"/><text x="54" y="736" font-size="12.5" fill="#333">Match</text>
<rect x="130" y="724" width="18" height="14" rx="3" fill="#c62828"/><text x="154" y="736" font-size="12.5" fill="#333">No match</text>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

-18
View File
@@ -1,18 +0,0 @@
Title: About me
Tags: about
Date: 2023-03-30
As a computer scientist specializing in medical data science, my skills cover a broad range of technical areas. With a master's degree in medical informatics and a background in systems administration, I am proficient in both software development and system management.
My development skills encompass Python, Bash, PowerShell andsome prior experience with Java, JavaScript, C and C++. This enables me to deliver software solutions that address the unique needs of medical data science teams, including data exchange, interoperability, and automation.
On the system management side, I possess expertise in Linux and FreeBSD administration, enabling me to manage and secure Unix-based systems. I am well-versed in automation tools like Ansible, which I leverage to scale infrastructure and automate tasks. Additionally, I have experience in DevOps techniques and software test automation.
In terms of project management, I am skilled in using collaboration tools such as GitLab, Atlassian JIRA and Confluence to streamline team workflows and maximize productivity. My experience in these areas allows me to effectively communicate with stakeholders, facilitate project workflows, and track progress.
In addition to my technical skills, I am familiar with healthcare data exchange standards such as HL7 FHIR and HL7v2, as well as REST APIs. This knowledge is critical to my ability to work on medical data science projects that involve data exchange and interoperability.
Currently, I'm expanding into data architecture technologies, delving into advanced concepts in data modeling, database design, and optimizing data storage.
Overall, I am a versatile and experienced computer scientist with a passion for medical data science. My proficiencies in software development, system management, and project management equip me to tackle any technical challenge in the field of medical data science.
+11
View File
@@ -0,0 +1,11 @@
Title: Über mich
Slug: about-me
Lang: de
Tags: about
Date: 2023-03-30
Angefangen hat alles aus Spaß am Gerät, lange bevor daraus ein Beruf wurde. Über die Jahre bin ich vom IT-Administrator zur medizinischen Informatik gewandert. Linux und Unix sind dabei die Konstante geblieben, auf der so ziemlich alles andere aufbaut. Heute leite ich den Arbeitsbereich Infrastruktur am [Datenintegrationszentrum des Universitätsklinikums Jena](https://www.uniklinikum-jena.de/gbit/Datenintegrationszentrum.html), im Rahmen der [Medizininformatik-Initiative](https://www.medizininformatik-initiative.de/) und des [Netzwerks Universitätsmedizin](https://www.netzwerk-universitaetsmedizin.de/). Dazwischen lag ein Master in Medizinischer Informatik, weshalb ich mich meist an der Schnittstelle zwischen Systemadministration, Softwareentwicklung und klinischen Datenstandards bewege. Im Alltag arbeite ich viel mit FHIR und HL7v2, meist in Python, mit Kafka und PostgreSQL im Hintergrund.
Privat betreibe ich zuhause ein kleines Homelab: ein paar Proxmox-Nodes, Ceph-Storage, eigene PKI. Falls mal was fehlt, helfen ein 3D-Drucker und ein bisschen Elektronik weiter. Und wenn gerade kein Server brennt, bin ich auch mal im Garten zu finden.
Diese Seite ist eine Mischung aus beidem: technische HowTos und Notizen aus Arbeit und Homelab.
+11
View File
@@ -0,0 +1,11 @@
Title: About me
Slug: about-me
Lang: en
Tags: about
Date: 2023-03-30
It all started for the hack value of it, long before it became a job. Over the years I moved from IT administrator to medical informatics. Linux and Unix have stayed the constant that pretty much everything else is built on. Today I lead the Infrastructure work area at the [Data Integration Center of the Jena University Hospital](https://www.uniklinikum-jena.de/gbit/en/IT+Department/Data+Integration+Center.html), as part of the [Medical Informatics Initiative](https://www.medizininformatik-initiative.de/en) and the [Network of University Medicine](https://www.netzwerk-universitaetsmedizin.de/en). In between came a master's degree in Medical Informatics, which is why I usually sit at the intersection of systems administration, software development, and clinical data standards. Day to day I work a lot with FHIR and HL7v2, mostly in Python, with Kafka and PostgreSQL in the background.
At home I run a small homelab: a few Proxmox nodes, Ceph storage, my own PKI. If something's missing, a 3D printer and a bit of electronics usually help out. And when no server is on fire, you might also find me in the garden.
This site is a mix of both: technical how-tos and notes from work and homelab.
+31 -7
View File
@@ -6,14 +6,27 @@ AUTHOR = 'haemka'
SITENAME = 'haemka'
SITEURL = ''
PATH = './content/'
TIMEZONE = 'Europe/Berlin'
DEFAULT_LANG = 'en'
LOCALE = 'en_US.UTF-8'
THEME = './themes/latex/'
PLUGINS = ['i18n_subsites']
I18N_SUBSITES = {
'de': {
'SITENAME': 'haemka',
'LOCALE': 'de_DE.UTF-8',
},
}
PATH = './content/'
PAGE_PATHS = ['pages']
ARTICLE_PATHS = ['en', 'de']
# Feed generation is usually not desired when developing
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
@@ -27,11 +40,22 @@ LINKS = (('Pelican', 'http://getpelican.com/'),
('Jinja2', 'http://jinja.pocoo.org/'),
('You can modify those links in your config file', '#'),)
# Social widget
SOCIAL = (('You can add links in your config file', '#'),
('Another social link', '#'),)
DEFAULT_PAGINATION = False
# Uncomment following line if you want document-relative URLs when developing
RELATIVE_URLS = True
DISPLAY_RECENT_ARTICLES_ON_MENU = True
RECENT_ARTICLES_COUNT = 10
MARKDOWN = {
'extension_configs': {
'markdown.extensions.extra': {},
'markdown.extensions.codehilite': {'css_class': 'highlight'},
'markdown.extensions.meta': {},
'markdown.extensions.toc': {
'permalink': True,
'toc_depth': '2-4',
},
},
'output_format': 'html5',
}
+2 -2
View File
@@ -3,7 +3,7 @@
WEBSERVER='aquaria'
build() {
[[ ! ${VIRTUAL_ENV} ]] && NO_VENV=1 && source ./venv/bin/activate
[[ ! ${VIRTUAL_ENV} ]] && NO_VENV=1 && source ./.venv/bin/activate
pelican
retval=$?
[[ ${NO_VENV} ]] && deactivate
@@ -11,7 +11,7 @@ build() {
}
upload() {
rsync -avz --delete output/* ${WEBSERVER}:~/web/
rsync -avz --delete output/* ${WEBSERVER}:~/web/haemka.de/
}
build