tag:forum.selfhtml.org,2005:/selfmysql BETWEEN – SELFHTML-Forum2022-08-10T14:44:16Zhttps://forum.selfhtml.org/self/2022/aug/09/mysql-between/1800993?srt=yes#m1800993Jörg2022-08-09T12:34:47Z2022-08-09T12:34:47Zmysql BETWEEN<p>Hallo,</p>
<p>ich bin davon ausgegangen, dass mysql-BETWEEN folgendes bedeutet:</p>
<pre><code class="block">BETWEEN '2022-06-01' AND '2022-06-30' ist dasselbe wie >= '2022-06-01' AND <= '2022-06-30'
</code></pre>
<p>Wenn ich damit falsch liege, dann ok.</p>
<p>Aber wenn nicht, warum werden mir dann Rechnungen bei nachfolgender Query nicht angezeigt, die am 30.06.2022 erstellt wurden?</p>
<pre><code class="block">SELECT ID FROM rg WHERE Erstelldatum BETWEEN '2022-06-01' AND '2022-06-30'
</code></pre>
<p>Meine Spalte Erstelldatum ist eine datetime-Spalte.<br>
Und es sind am 30.06.2022 definitiv Rechnungen erstellt worden und sie stehen auch in der db drin. Und wenn ich die Query auf BETWEEN '2022-06-01' AND '2022-07-01' ändere, bekomme ich auch die Rechnungen mit Erstelldatum 30.06.2022 angezeigt.</p>
<p>Wo liegt hier der Fehler?</p>
<p>Jörg</p>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1800995?srt=yes#m1800995Rolf B2022-08-09T13:26:35Z2022-08-09T13:26:35Zmysql BETWEEN<p>Hallo Jörg,</p>
<p>was <strong>genau</strong> steht für die Spalte ErstellDatum in der DB? Hast Du Beispiele?</p>
<p>Warum frage ich: Ich mutmaße, dass da auch Uhrzeiten stehen. Und die Angabe '2022-06-30' bedeutet: Mitternacht vom 29. auf den 30. Juni</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - obstruxi
</div>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801002?srt=yes#m1801002Auge2022-08-09T16:34:08Z2022-08-09T16:35:05Zmysql BETWEEN<p>Hallo</p>
<blockquote>
<p>Warum frage ich: Ich mutmaße, dass da auch Uhrzeiten stehen. Und die Angabe '2022-06-30' bedeutet: Mitternacht vom 29. auf den 30. Juni</p>
</blockquote>
<p>Wenn MySQL das nicht anders macht als beispielsweise MS SQL, dann heißt …</p>
<pre><code class="block language-sql"><span class="token operator">BETWEEN</span> <span class="token string">'2022-06-01'</span> <span class="token operator">AND</span> <span class="token string">'2022-06-30'</span>
</code></pre>
<p>… wie du schon vermutest …</p>
<pre><code class="block language-sql"><span class="token operator">BETWEEN</span> <span class="token string">'2022-06-01 00:00:00'</span> <span class="token operator">AND</span> <span class="token string">'2022-06-30 00:00:00'</span>
</code></pre>
<p>… womit alle Rechnungen, die am 30.06.2022 <em>nach 0 Uhr</em> erstellt wurden – was mutmaßlich auf alle Rechnungen des Tages zutreffen wird –, nicht der Bedingung entsprechen.</p>
<p>Tschö, Auge</p>
<div class="signature">-- <br>
200 ist das neue 35.
</div>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801012?srt=yes#m1801012Jörg2022-08-10T10:53:30Z2022-08-10T10:53:30Zmysql BETWEEN<p>Hallo Rolf, hallo Auge,</p>
<p>na prima, dann haben wir ja den Fehler gefunden.
Denn Ihr habt beide recht, dass in meiner Spalte auch Uhrzeiten drin stehen, womit dann (praktisch gesehen) alle vom 30.6 rausfallen.</p>
<p>Nächste Frage: Wie behebe ich den Fehler am einfachsten?
Klar, ich könnte BETWEEN durch >= und <= ersetzen.</p>
<p>Geht es auch besser?</p>
<pre><code class="block language-php"><span class="token variable">$d</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DateTime</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$Year</span></span>-<span class="token interpolation"><span class="token variable">$month</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$lastday</span> <span class="token operator">=</span> <span class="token variable">$d</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-t'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$firstday</span> <span class="token operator">=</span> <span class="token variable">$d</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$query</span><span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT
ID,
rg
WHERE Erstelldatum BETWEEN '"</span><span class="token operator">.</span><span class="token variable">$firstday</span><span class="token operator">.</span><span class="token string double-quoted-string">"' AND '"</span><span class="token operator">.</span><span class="token variable">$lastday</span><span class="token operator">.</span><span class="token string double-quoted-string">"'"</span><span class="token punctuation">;</span>
</code></pre>
<p>Gruß, Jörg</p>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801013?srt=yes#m1801013Auge2022-08-10T11:10:58Z2022-08-10T11:12:09Zmysql BETWEEN<p>Hallo</p>
<blockquote>
<p>na prima, dann haben wir ja den Fehler gefunden.
Denn Ihr habt beide recht, dass in meiner Spalte auch Uhrzeiten drin stehen, womit dann (praktisch gesehen) alle vom 30.6 rausfallen.</p>
<p>Nächste Frage: Wie behebe ich den Fehler am einfachsten?
Klar, ich könnte BETWEEN durch >= und <= ersetzen.</p>
</blockquote>
<p>Ja, könntest du.</p>
<blockquote>
<p>Geht es auch besser?</p>
</blockquote>
<p>Natürlich. Es spricht nichts dagegen, Zeitstempel in <code>BETWEEN</code> mitsamt einer Uhrzeit zu benutzen.</p>
<blockquote>
<pre><code class="block language-php"><span class="token variable">$d</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DateTime</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$Year</span></span>-<span class="token interpolation"><span class="token variable">$month</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$lastday</span> <span class="token operator">=</span> <span class="token variable">$d</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-t'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$firstday</span> <span class="token operator">=</span> <span class="token variable">$d</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$query</span><span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT
ID,
rg
WHERE Erstelldatum BETWEEN '"</span><span class="token operator">.</span><span class="token variable">$firstday</span><span class="token operator">.</span><span class="token string double-quoted-string">"' AND '"</span><span class="token operator">.</span><span class="token variable">$lastday</span><span class="token operator">.</span><span class="token string double-quoted-string">"'"</span><span class="token punctuation">;</span>
</code></pre>
</blockquote>
<p>Wenn du die aber weiterhin weglässt, wird das nichts.</p>
<pre><code class="block language-php"><span class="token variable">$d</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DateTime</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$Year</span></span>-<span class="token interpolation"><span class="token variable">$month</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Umsortiert, weil der erste Tag vor dem letzten kommt.</span>
<span class="token comment">// Die Uhrzeit '00:00:00' ist optional, könnte aber wie bei $lastday angegeben werden </span>
<span class="token variable">$firstday</span> <span class="token operator">=</span> <span class="token variable">$d</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Hier habe ich einfach eine passende Uhrzeit rangehängt</span>
<span class="token variable">$lastday</span> <span class="token operator">=</span> <span class="token variable">$d</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-t 23:59:59'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$query</span><span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT
ID,
rg
WHERE Erstelldatum BETWEEN '"</span><span class="token operator">.</span><span class="token variable">$firstday</span><span class="token operator">.</span><span class="token string double-quoted-string">"' AND '"</span><span class="token operator">.</span><span class="token variable">$lastday</span><span class="token operator">.</span><span class="token string double-quoted-string">"'"</span><span class="token punctuation">;</span>
</code></pre>
<p>Tschö, Auge</p>
<div class="signature">-- <br>
200 ist das neue 35.
</div>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801014?srt=yes#m1801014Jörg2022-08-10T11:31:36Z2022-08-10T11:31:36Zmysql BETWEEN<p>Hallo Auge,</p>
<blockquote>
<p>Natürlich. Es spricht nichts dagegen, Zeitstempel in <code>BETWEEN</code> mitsamt einer Uhrzeit zu benutzen.</p>
</blockquote>
<p>Ah ok.
Genau sowas meinte ich, danke.</p>
<p>Jörg</p>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801017?srt=yes#m1801017Tabellenkalk2022-08-10T12:20:04Z2022-08-10T12:20:04Zmysql BETWEEN<p>Hallo,</p>
<blockquote>
<p>Natürlich. Es spricht nichts dagegen, Zeitstempel in <code>BETWEEN</code> mitsamt einer Uhrzeit zu benutzen.</p>
</blockquote>
<p>...</p>
<blockquote>
<p>Wenn du die aber weiterhin weglässt, wird das nichts.</p>
</blockquote>
<p>Was spricht dagegen, einfach einen Tag draufzuschlagen?</p>
<p>Gruß<br>
Kalk</p>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801018?srt=yes#m1801018Auge2022-08-10T13:14:10Z2022-08-10T13:14:10Zmysql BETWEEN<p>Hallo</p>
<blockquote>
<blockquote>
<p>Natürlich. Es spricht nichts dagegen, Zeitstempel in <code>BETWEEN</code> mitsamt einer Uhrzeit zu benutzen.</p>
</blockquote>
<p>...</p>
<blockquote>
<p>Wenn du die aber weiterhin weglässt, wird das nichts.</p>
</blockquote>
<p>Was spricht dagegen, einfach einen Tag draufzuschlagen?</p>
</blockquote>
<p>Praktisch wohl nichts. Es ist überaus unwahrscheinlich, dass beispielsweise zwischen <code>2022-06-30 23:59:59</code> und <code>2022-07-01 00:00:00</code> eine Rechnung erstellt wird. Falls das Datum aus einer manuellen Eingabe stammen sollte, erspart man sich mit dem anhängen der Uhrzeit einfach, das Datum umzuformen (<code>2022-06-irgendwas</code> => <code>2022-06-irgendwas + 1</code>).</p>
<p>Tschö, Auge</p>
<div class="signature">-- <br>
200 ist das neue 35.
</div>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801019?srt=yes#m1801019Jörg2022-08-10T13:30:03Z2022-08-10T13:30:16Zmysql BETWEEN<p>Hallo,</p>
<blockquote>
<blockquote>
<p>Was spricht dagegen, einfach einen Tag draufzuschlagen?</p>
</blockquote>
<p>Praktisch wohl nichts. Es ist überaus unwahrscheinlich, dass beispielsweise zwischen <code>2022-06-30 23:59:59</code> und <code>2022-07-01 00:00:00</code> eine Rechnung erstellt wird. Falls das Datum aus einer manuellen Eingabe stammen sollte, erspart man sich mit dem anhängen der Uhrzeit einfach, das Datum umzuformen (<code>2022-06-irgendwas</code> => <code>2022-06-irgendwas + 1</code>).</p>
</blockquote>
<p>Einfach +1 ?<br>
Nicht + 1 day?</p>
<p>Jörg</p>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801020?srt=yes#m1801020Auge2022-08-10T13:56:45Z2022-08-10T14:00:20Zmysql BETWEEN<p>Hallo</p>
<blockquote>
<blockquote>
<blockquote>
<p>Was spricht dagegen, einfach einen Tag draufzuschlagen?</p>
</blockquote>
<p>Praktisch wohl nichts. Es ist überaus unwahrscheinlich, dass beispielsweise zwischen <code>2022-06-30 23:59:59</code> und <code>2022-07-01 00:00:00</code> eine Rechnung erstellt wird. Falls das Datum aus einer manuellen Eingabe stammen sollte, erspart man sich mit dem anhängen der Uhrzeit einfach, das Datum umzuformen (<code>2022-06-irgendwas</code> => <code>2022-06-irgendwas + 1</code>).</p>
</blockquote>
<p>Einfach +1 ?<br>
Nicht + 1 day?</p>
</blockquote>
<p>Das ist kein Code, nur Pseudocode, um mein Anliegen zu verdeutlichen.</p>
<p>Wenn du in MySQL mit <code>DATE_ADD</code> arbeiten willst, brauchst du natürlich die passende Syntax. Und ja, da ist <code>INTERVAL 1 DAY</code> angesagt. Oder auch <code>INTERVAL -1 DAY</code>, falls du einen Tag abziehen willst, wobei MySQL dafür auch die Funktion <code>DATE_SUB</code> anbietet, bei der das negative Vorzeichen wegfällt. Andere SQL-Server, wie <a href="https://docs.microsoft.com/de-de/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-ver16#ModifyDateandTimeValues" rel="nofollow noopener noreferrer">der von Microsoft</a>, kennen nur <code>DATEADD</code> oder auch <code>DATE_ADD</code> oder <code>DATE</code> <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>. Dort <em>musst</em> du bei Bedarf mit dem Vorzeichen hantieren, bei MySQL <em>kannst</em> du es oder eben auch nicht.</p>
<p>Tschö, Auge</p>
<div class="signature">-- <br>
200 ist das neue 35.
</div>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>PostgreSQL hat soetwas nicht, kann aber natürlich auch an Zeitwerten herumrechnen: <a href="https://database.guide/postgresql-dateadd-equivalent/" rel="nofollow noopener noreferrer">PostgreSQL DATEADD() Equivalent</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1801021?srt=yes#m1801021Rolf B2022-08-10T14:44:16Z2022-08-10T14:44:16Zmysql BETWEEN<p>Hallo Auge,</p>
<p>die portablere Lösung ist vermutlich, das Intervallende in PHP zu bestimmen.</p>
<pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token variable">$reportMonth</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DateTimeImmutable</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"2022-08"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$firstday</span> <span class="token operator">=</span> <span class="token variable">$reportMonth</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$lastday</span> <span class="token operator">=</span> <span class="token variable">$reportMonth</span><span class="token operator">-></span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DateInterval</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"P1M"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Y-m-d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">"first: <span class="token interpolation"><span class="token variable">$firstday</span></span>, last: <span class="token interpolation"><span class="token variable">$lastday</span></span>, "</span><span class="token punctuation">;</span>
</span></code></pre>
<p>Ich bevorzuge für so was die <code>DateTimeImmutable</code>-Klasse, weil <code>DateTime::add</code> das Objekt modifiziert statt ein neues zu erzeugen.</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - obstruxi
</div>