WinFuture-Forum.de: Brauche SQL Datums Hilfe bei einer Abfrage - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Brauche SQL Datums Hilfe bei einer Abfrage

#1 Mitglied ist offline   dernoname 

  • Gruppe: aktive Mitglieder
  • Beiträge: 71
  • Beigetreten: 23. November 07
  • Reputation: 0

geschrieben 04. Dezember 2017 - 08:46

Hallo, ich habe eine kleine Datenbank, welche gekürtzt so aussieht:

nummer Datum
1701438 2017-11-30 00:00:00.000
1701437 2017-11-30 00:00:00.000
1701436 2017-11-29 00:00:00.000
1701435 2017-11-29 00:00:00.000
1701434 2017-11-28 00:00:00.000
1701433 2017-11-28 00:00:00.000
1701432 2017-11-28 00:00:00.000
1701431 2017-11-28 00:00:00.000
1701430 2017-11-28 00:00:00.000


Jetzt möchte ich gerne eine Abfrage erstellen, welche mir einen gewissen Datumsbereich auswirft, z.B. alle NUMMERN die zwischen 2017-11-01 und 2017-11-30 liegen. Mein SQL sieht so aus:


select nummer, Datum  from auftrag  WHERE datum  between '2017-11-05' and '2017-11-30' 


Zitat

Jedoch erhalte ich eine Fehlermeldung

Meldung 242, Ebene 16, Status 3, Zeile 1
Bei der Konvertierung eines char-Datentyps in einen datetime-Datentyp liegt der datetime-Wert außerhalb des gültigen Bereichs.

(0 Zeile(n) betroffen)



Kann mir jemand sagen, wie ich das Datum Konvertieren kann, damit die Abfrage funktioniert bzw. kann man das auch durch einen anderne SQL Befehl lösen ?

Danke
0

Anzeige

#2 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.325
  • Beigetreten: 14. August 15
  • Reputation: 114

geschrieben 04. Dezember 2017 - 10:12

Du musst in deiner Abfrage das genaue Format einhalten.

Das Datum in den Felder liegt im DATETIME Format vor. Deine Abfrage muss das also auch verwenden.

Eine Abfrage auf between '2017-11-05' and '2017-11-30' klappt da nicht, da es als CHAR Wert interpretiert wird. Ich weiß auch nicht genau ob BETWEEN auf DATETIME Angaben angewendet werden kann.

Ich rate dir immer alle SQL Befehle groß zu schreiben und die Datenbank, Tabellen und Feldnamen klein und nicht die Schreibweisen zu mischen so wie du es gemacht hast Zusätzlich kannst du auch noch den Datenbank, Tabellen und Feldnamen einen Präfix voranstellen um auch diese voneinander besser zu unterscheiden. Das erleichtert die Fehlersuche ungemein und erzeugt gut lesbaren Code, den man auch in 10 Jahren schon versteht.

Beispiel:

SELECT field_nummer, field_datum FROM db_liste.table_auftrag WHERE field_datum BETWEEN '2017-11-05 00:00:00.000' AND '2017-11-30 00:00:00.000';


P.S.: Welches SQL ist das?

Dieser Beitrag wurde von Gispelmob bearbeitet: 04. Dezember 2017 - 16:11

0

#3 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.271
  • Beigetreten: 11. September 10
  • Reputation: 211

geschrieben 04. Dezember 2017 - 10:47

Also ich habe das so gelöst:


$abfrage = $sql->prepare("SELECT * FROM `tabelle` WHERE zeit BETWEEN :anfang AND :ende ;");


$abfrage->bindValue(':anfang', date('Y-m-d',strtotime($anfang)));
$abfrage->bindValue(':ende', date('Y-m-d',strtotime($ende)));

$abfrage->execute() ;




$anfang und $ende sind die Variablen in denen mein Datum als Text drinsteht, wie es vom Formular kommt. Die Formatierung bei der Umwandlung muß natürlich dem Datenbankeintrag entsprechen. Wenn die Uhrzeit ohnehin nicht drinsteht, kann man die auch ganz weglassen, also date statt datetime in der Tabelle.(Ist jetzt php, mySQL mit PDO, weil da ja nix Genaues steht, um was es geht.)
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#4 Mitglied ist offline   dernoname 

  • Gruppe: aktive Mitglieder
  • Beiträge: 71
  • Beigetreten: 23. November 07
  • Reputation: 0

geschrieben 04. Dezember 2017 - 12:34

Danke für die Antworten und sorry für die wenigen infos.

Es handelt sich um eine ältere MySQL Datenbank.
Da ich selbst kaum Ahnung habe tue ich mir aktuell etwas schwer, meine Abfrage mit dem eingrenzenden Datum zu verknüpfen.


Wenn ich richtig liege, so muss man das Datum konvertieren. Jedoch habe ich noch keine Idee wie nachher der SQL Befehl richtig aussieht.
0

#5 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.952
  • Beigetreten: 20. Juli 07
  • Reputation: 879

geschrieben 04. Dezember 2017 - 18:42

DATETIMES werden IMMER als char verstanden, deswegen kommen da auch Hochkomma drumherum.

Man könnte sein Datum per Funktion reinfüttern. siehe dazu die MySQL Referenz.

Und man könnte das Datum so eingeben, wie es MySQL ausgibt; normalerweise funktioniert sowas dann problemlos. Nicht vergessen, daß Tag, Monat und Jahr eben NICHT notwendigerweise in dieser Reihenfolge erwartet werden!

Hier ist das ja nun datetime, also würd ich spontan erstmal versuchen, mit sowas wie "Jan-01-2000 00:00:00" zu kommen.

So geht es bei mir:

MariaDB [test]> create table test (d datetime);
Query OK, 0 rows affected, 1 warning (0.36 sec)

MariaDB [test]> insert into test (d) values ('2001-10-01 00:11:22');
Query OK, 1 row affected (0.05 sec)

MariaDB [test]> select * from test;
+---------------------+
| d                   |
+---------------------+
| 2001-10-01 00:11:22 |
+---------------------+
1 row in set (0.00 sec)

MariaDB [test]> select month(d) from test;
+----------+
| month(d) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)




Bei Abfragen dann unbedingt aufpassen, da DATETIME eben die ZEIT berücksichtigt. <wert> BETWEEN '01.01.2000 00:00:00' AND '31.12.2000 00:00:00' schließt den 31. Dezember NICHT mit ein, dazu müßte man 23:59:59 als Ende-Zeit oder gleich den ersten Jan 2001 angeben.

Dieser Beitrag wurde von RalphS bearbeitet: 04. Dezember 2017 - 18:43

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#6 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.271
  • Beigetreten: 11. September 10
  • Reputation: 211

geschrieben 09. Dezember 2017 - 13:25

Beitrag anzeigenZitat (dernoname: 04. Dezember 2017 - 12:34)



Wenn ich richtig liege, so muss man das Datum konvertieren. Jedoch habe ich noch keine Idee wie nachher der SQL Befehl richtig aussieht.


Der ist ja schon soweit richtig in Deinem ersten Post. Du mußt nur entweder in die Abfrage die Uhrzeit mit reinschreiben, also die 00:00:00.000 hinter dem Datum oder wenn die Zeit sowieso immer 0 ist, lass sie ganz weg und mach in der Tabelle aus dem Format der Spalte DATE statt DATETIME.

Ich habe ja auf meiner kleinen Seite genau diesen Fall praktiziert, wo man Videos nach Datum filtern kann.

Dieser Beitrag wurde von Holger_N bearbeitet: 09. Dezember 2017 - 13:29

Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#7 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.325
  • Beigetreten: 14. August 15
  • Reputation: 114

geschrieben 09. Dezember 2017 - 17:18

Das stimmt. Wenn die Zeit immer 00:00:000 ist, dann kann man sie auch weglassen. Solche Überlegungen gehören jedoch bereits in das Stadium in dem man die Datenbank entwirft.^^ Naja. Änder den Feldtyp einfach auf DATE. Die 00:00:000 sollten dann automatisch verschwinden. Bevor du aber solche Strukturänderungen machst, mach dir vorher zur Sicherheit einen DB Dump.

Dieser Beitrag wurde von Gispelmob bearbeitet: 09. Dezember 2017 - 17:18

0

#8 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.271
  • Beigetreten: 11. September 10
  • Reputation: 211

geschrieben 09. Dezember 2017 - 17:49

Oder die Zeit ist nur in der Datenbank 0, soll aber eigentlich mit rein, dann ist wahrscheinlich an der Stelle im php-Script ein Fehler, wo die Zeit ermittelt oder in die Datenbank eingetragen wird oder wenn dazwischen irgendwas umgerechnet wird.
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#9 Mitglied ist offline   dernoname 

  • Gruppe: aktive Mitglieder
  • Beiträge: 71
  • Beigetreten: 23. November 07
  • Reputation: 0

geschrieben 15. Dezember 2017 - 08:57

danke für die Zahlreichen Antworten. Ich hab einfach die Schreibweise vom Dateum geändert und schon ging es *kopfschüttel*


-------------------------------------------------------------------------------
FALSCH >>> select nummer, Datum from auftrag WHERE datum between '2017-11-01' and '2017-11-30'

RICHTIG >>> select nummer, Datum from auftrag WHERE Datum>='01.11.2017' and Datum<='30.11.2017'
-------------------------------------------------------------------------------

Danke und Grüße :-)

Dieser Beitrag wurde von dernoname bearbeitet: 15. Dezember 2017 - 08:58

0

#10 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.271
  • Beigetreten: 11. September 10
  • Reputation: 211

geschrieben 15. Dezember 2017 - 09:24

Bei mir funktioniert deine »falsche« Version richtig und deine »richtige« Version zeigt auch Daten außerhalb des Bereiches an. Allerdings habe ich zusätzlich Groß- und Kleinschreibung beachtet.
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#11 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.952
  • Beigetreten: 20. Juli 07
  • Reputation: 879

geschrieben 15. Dezember 2017 - 23:43

Eher zuwenig. Mit DATETIME würd ich erwarten, daß da die Daten vom 30. November fehlen.

SQL interessiert sich üblicherweise nicht für Klein- oder Großschreibung (aber man kann Spaltennamen je nach SQL-Variante in [ ] oder in " " stecken, dann müssen sie 100%ig übereinstimmen. Wenn da inkonsistente Werte geliefert werden, solltest Du mal schauen, ob nicht ggf noch irgendwas im Argen ist. Wäre doof.

Kann aber auch sein, daß da was mit dem Format fürs Datum nicht stimmt. Standard-SQL muß sowas wie YYYY-MM-DD annehmen; wenn es das nicht tut, stimmt -vermutlich- mit der Abfrage was nicht, möglicherweise aber auch mit der DBMS dahinter.

An dieser Stelle hätten wir dann das potentielle Problem, daß Abfragen von bestehenden Daten und/oder bereits existierende Anwendungen für das DBMS nicht ordentlich funktionieren. Die verlangen nämlich meistens nach YYYY-MM-DD als Format.


Daher, Vorschlag: füge der DB-Tabelle eine weitere Spalte hinzu und definier die genau für das, was Du haben willst (also zB nur DATE, wenn TIME uninteressant sein sollte). Dann per
BEGIN;
 UPDATE TABLE bewußtetabelle SET neue_spalte = CAST(altespalte AS typderneuenspalte);

die neue Spalte füttern. Schauen, ob das richtige drinsteht. Paar Testabfragen laufen lassen, ob die funktionieren. Falls ja, die alte Spalte rauswerfen und der neuen Spalte den Namen der alten geben. Dann COMMIT sagen. Falls nein stattdessen halt ROLLBACK und die Änderungen sind wieder weg (bis auf die neue, wieder leere Spalte selber, die kann man mit ALTER TABLE ... DROP ... wieder loswerden.

Constraints nicht vergessen, soweit sinnvoll und zutreffend.

Dieser Beitrag wurde von RalphS bearbeitet: 15. Dezember 2017 - 23:45

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#12 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.271
  • Beigetreten: 11. September 10
  • Reputation: 211

geschrieben 16. Dezember 2017 - 01:59

Wenn ich '01.11.2017' anstatt '2017-11-01' benutze, habe ich Tage vom Oktober mit drin, weil einfach das Format so nicht stimmt.
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0