tag:forum.selfhtml.org,2005:/self mysql BETWEEN – SELFHTML-Forum 2022-08-10T14:44:16Z https://forum.selfhtml.org/self/2022/aug/09/mysql-between/1800993?srt=yes#m1800993 Jörg 2022-08-09T12:34:47Z 2022-08-09T12:34:47Z mysql 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#m1800995 Rolf B 2022-08-09T13:26:35Z 2022-08-09T13:26:35Z mysql 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#m1801002 Auge 2022-08-09T16:34:08Z 2022-08-09T16:35:05Z mysql 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#m1801012 Jörg 2022-08-10T10:53:30Z 2022-08-10T10:53:30Z mysql 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#m1801013 Auge 2022-08-10T11:10:58Z 2022-08-10T11:12:09Z mysql 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#m1801014 Jörg 2022-08-10T11:31:36Z 2022-08-10T11:31:36Z mysql 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#m1801017 Tabellenkalk 2022-08-10T12:20:04Z 2022-08-10T12:20:04Z mysql 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#m1801018 Auge 2022-08-10T13:14:10Z 2022-08-10T13:14:10Z mysql 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#m1801019 Jörg 2022-08-10T13:30:03Z 2022-08-10T13:30:16Z mysql 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#m1801020 Auge 2022-08-10T13:56:45Z 2022-08-10T14:00:20Z mysql 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#m1801021 Rolf B 2022-08-10T14:44:16Z 2022-08-10T14:44:16Z mysql 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>