SQL Werte zwischen zwei Datum + Uhrzeiten

Exodes

Ensign
Registriert
Jan. 2010
Beiträge
169
Hallo zusammen,

derzeit hänge in meinem C#-Projekt am Erstellen eines SQL-Befehls, der Werte zwischen zwei Zeitpunkten ausgegeben soll.
Hier ist es entscheidend, dass die Uhrzeit miteinbezogen wird.
Der SQL-Befehl soll auf einer Microsoft-Datenbank des Datentypens .mdb ausgeführt werden, dessen Felddatentyp "Datum/Uhrzeit" ist. Ein Format ist für dieses Feld nicht vorgegeben.

C#:
string startdatum = x.ToString("yyyy-MM-dd HH:mm:ss");
string sql = $"SELECT DATUM AND LAUFENDE_KOSTEN FROM BUCHHALTUNG WHERE NAME = '{name}' AND DATUM > #{startdatum}#";
Fehlermeldung der Exception: "Die angegebene Umwandlung ist ungültig."

Mit dem Befehl BETWEEN ist es ebenfalls nicht möglich:
C#:
string sql = $"SELECT DATUM AND LAUFENDE_KOSTEN FROM BUCHHALTUNG WHERE NAME = '{name}' AND DATUM BETWEEN #{startdatum}# AND #{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}#";

Nur wenn ich das Format auf "yyyy-MM-dd" reduziere, funktioniert es. Aber wie schon gesagt, ist dies nicht präzise genug.

Ich hoffe, ihr könnt mir weiterhelfen.


Mit freundlichen Grüßen
Exodes
 
Zuletzt bearbeitet:
Hat die query am Ende einfach Anführungszeichen?

Falls nicht probier es Mal so: #'yyyy-MM-dd HH:mm:ss'#

(bin mir nicht sicher, ob die toString-Funktion schon Single-Quotes hinzufügt
Und sorry für die schlechte Schreibweise, ich bin am Handy)
 
Wieso überhaupt das Datum als String formatieren? In parametrisierten Queries sollte man das Datum einfach so als Parameter mitgeben können, um den Rest kümmert sich der Datenbanktreiber.

Generell sollten alle variablen Teile der Query als Parameter übergeben werden und nicht einfach im String eingebettet werden. Wenn z.B. die "name" Variable in diesem Beispiel von einem Benutzer angegeben wird, dann kann dieser Benutzer durch SQL Injection die gesamte Datenbank lesen, ändern oder löschen (falls keine Gegenmaßnahmen in nicht gezeigtem Code sind).
 
  • Gefällt mir
Reaktionen: BeBur
So ich habe das Problem gefunden. Beide SQL-Befehle funktionieren, wenn man im SELECT statt AND ein Kommata verwendet wird. Ein simpler Syntaxfehler...

Korrigierte SQL-Befehle:
C#:
string sql = $"SELECT DATUM, LAUFENDE_KOSTEN FROM BUCHHALTUNG WHERE NAME = '{name}' AND DATUM > #{startdatum}#";
C#:
string sql = $"SELECT DATUM, LAUFENDE_KOSTEN FROM BUCHHALTUNG WHERE NAME = '{name}' AND DATUM BETWEEN #{startdatum}# AND #{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}#";

Ohne die Konvertierung vom DateTime zum String funktionierte der SQL-Befehl in diversen Versuchen nicht.
Warum auch immer, ist es bei mir notwendig, dass das Datum genau so formatiert ist.
Ohne Konvertierung sieht die Formatierung so aus: dd.MM.yyyy HH:mm:ss

Wenn z.B. die "name" Variable in diesem Beispiel von einem Benutzer angegeben wird,
Der Name wird ausgelesen anhand der vom betroffenen User eingegebenen Benutzerdaten.

Dalek schrieb:
durch SQL Injection die gesamte Datenbank lesen, ändern oder löschen
Die Datenbank ist passwortgeschützt und die Einträge sind verschlüsselt. Aber ich denke mal, dass dies nicht ausreicht, um sich gegen eine SQL-Injection zu schützen, oder? In der Hinsicht bin ich leider ein totaler Anfänger :rolleyes:
Welche gängigen Schutzmaßnahmen gibt es, um eine SQL-Injection zu verhindern?
 
SQL Befehle einfach durch Aneinanderhängen von Strings zusammenzustellen ist fast immer der völlig falsche Weg. Die korrekte Methode is "parametrized queries" zu verwenden. Dabei gibt man Platzhalter in dem SQL Befehl an, und die tatsächlichen Werte die eingesetzt werden sollen separat. Dann gibt es keine SQL Injection, und man muss auch nicht ein Datum vorher in einen String konvertieren.

Siehe zum Beispiel die folgende Antwort auf Stack Overflow als Beispiel:

https://stackoverflow.com/a/7505842
 
Zuletzt bearbeitet:
Exodes schrieb:
Aber ich denke mal, dass dies nicht ausreicht, um sich gegen eine SQL-Injection zu schützen, oder?

Nicht zwangsläufig. SQL-Injection ist quasi das "Kapern" des SQL das du ausführst, indem SQL-Befehle im String stehen, der direkt im SQL verwendet wird.

Pseudocode (kann die C# Syntax nicht):
PHP:
//die HTTP-Post-Variable "Name" enthält eine SQL-Injection,
//dabei wird das vorgesehene SQL-Statement abgeschlossen und anschließend die komplette "users"-Tabelle ausgelesen
//$_POST["Name"] = "' '; SELECT * FROM users;"
$name = $_POST["Name"];

$sql = 'SELECT id FROM users WHERE name ='.$name.';';

//Im SQL steht dann:
SELECT id FROM users WHERE name = ' ';
SELECT * FROM users;

Verhindern kann man das, indem man den String vorher von SQL befreit. Dafür bringt C# sicher Methoden mit.
 
Zurück
Oben