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: 70
  • 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.179
  • Beigetreten: 14. August 15
  • Reputation: 98

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.228
  • Beigetreten: 11. September 10
  • Reputation: 204

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: 70
  • 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.802
  • Beigetreten: 20. Juli 07
  • Reputation: 861

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.228
  • Beigetreten: 11. September 10
  • Reputation: 204

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.179
  • Beigetreten: 14. August 15
  • Reputation: 98

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.228
  • Beigetreten: 11. September 10
  • Reputation: 204

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

Thema verteilen:


Seite 1 von 1

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