Entwickler-Ecke

Datenbanken - SQL Datenbankabfrage --> Problem mit Datum...


highlander78 - Fr 12.03.10 02:53
Titel: SQL Datenbankabfrage --> Problem mit Datum...
Hallo,

zu meinem Problem.

In meiner Abfrage lasse ich mir 3 Spalten anzeigen.

In einer Spalte ist das Datum und Uhrzeit in diesem Format " TT.MM.JJJJ XX:XX "

1. möchte ich gerne alle Einträge eines bestimmten Datums anzeigen
2. alle Einträge von "Datum,Uhrzeit" bis "Datum,Uhrzeit".

Ich habe eine Methode "GetData" mit der ich die SQL Kommandos erzeuge.

Zitat:
Mit diesem Kommando bekomme ich alle 3 Tabellen angezeigt:

GetData("SELECT lError, dtTime, strPartNumber FROM dbo.V_PICKUPERROR6");

Jetzt wollte ich nach Datum filtern:
GetData("SELECT lError, dtTime, strPartNumber FROM dbo.V_PICKUPERROR6 WHERE dtTime LIKE '11.03.2010' ");

Leider klappt das nicht.

Vielleicht hat jemand paar Tips.

Im Anhang ist ein Screenshot der Tabelle


Martok - Fr 12.03.10 03:57

Hi,

Ist die Spalte ein echtes DATETIME/TIMESTAMP-Feld?

Wenn ja, kann man das Datum daraus extrahieren und zum Vergleichen verwenden, z.B. mit DATE() [http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date].

Da echte DATETIME-Felder normalerweise aber das ISO-Format für die Anzeige nutzen, nehme ich mal an dass da einer mit Textfeldern rechnen will?
Dann müsste man nämlich erstmal ein Datum aus dem Datum machen ( ;) ), dafür gibts STR_TO_DATE() [http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date].

Zusammen mit deinem Code ergibt das also:

SQL-Anweisung
1:
2:
3:
SELECT lError, dtTime, strPartNumber
FROM dbo.V_PICKUPERROR6
WHERE STR_TO_DATE(dtTime, "%d.%m.%Y")="2010-03-01"

Achtung: hier ist der Format-Ausdruck etwas gekürzt, da wir die Uhrzeit sowieso abgeschnitten hätten :arrow: braucht MySQL gar nicht erst parsen.

Für den zweiten Fall brauchen wir sie aber:

SQL-Anweisung
1:
2:
3:
SELECT lError, dtTime, strPartNumber
FROM dbo.V_PICKUPERROR6
WHERE STR_TO_DATE(dtTime, "%d.%m.%Y %H:%i"BETWEEN "2010-03-01 07:30" AND "2010-03-05 16:00"

(erste Arbeitswoche des März, extra auf den Kalender geguckt :zwinker: )

Du solltest allerdings wissen, dass das relativ langsam ist, die Spalte sollte schon DATETIME sein. Die Statements sind dann analog gebaut, nur halt das erste mit DATE().


HTH,
Martok


highlander78 - Fr 12.03.10 10:03

Schaue mir später den Eintrag in der Datenbank an ...normalerweise sollte die Spalte "dtTime" schon ein DATETIME sein.
Bin mir aber nicht sicher...

Danke für die flotte Antwort..


Gruss


highlander78 - Fr 12.03.10 16:31

Hi,

habe mir gerade die "dtTime" Spalte angesehen und es sieht so aus:


C#-Quelltext
1:
dtTime(datetime,not null)                    


mit der Abfrage bekomme ich nur eine leere Zeile angezeigt, es sind aber daten mit dem Datum vorhanden..


SQL-Anweisung
1:
SELECT lError, dtTime, strPartNumber FROM dbo.V_PICKUPERROR6 WHERE dtTime = '12.03.2010'                    


Martok - Fr 12.03.10 21:05

Hi,

meinen Beitrag hast nicht gelesen?

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ja, kann man das Datum daraus extrahieren und zum Vergleichen verwenden, z.B. mit [url=http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date]DATE()[/url].

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Da echte DATETIME-Felder normalerweise aber das ISO-Format für die Anzeige nutzen


Also nochmal:

SQL-Anweisung
1:
2:
3:
SELECT lError, dtTime, strPartNumber
FROM dbo.V_PICKUPERROR6
WHERE DATE(dtTime)="2010-03-01"



SQL-Anweisung
1:
2:
3:
SELECT lError, dtTime, strPartNumber
FROM dbo.V_PICKUPERROR6
WHERE dtTime BETWEEN "2010-03-01 07:30" AND "2010-03-05 16:00"


Ich finde das grade erstaunlich, dass es da keinen Fehler gibt, wenn das Format nicht passt.
MySQL halt :roll:


highlander78 - Fr 12.03.10 21:57

Hi,

Ja ich habe deinen Beitrag gelesen und sitze schon seit 3 Stunden am Rechner...

Mit den von dir genannten Beispielen bekomme ich keine Ausgabe..

Ich habe mir gerade nochmal die Datenbank angesehen und habe festgestellt dass das Datum in der "dtTime" Spalte direkt auf der Datenbank in diesem Format angezeigt wird:

Hier eine Beispielzeile aus der "dtTime" Spalte in der Datenbank:


SQL-Anweisung
1:
2010-03-12 15:30:28.997                    


zum Vergleich sieht diese Spalte in dem DataGridView so aus:


SQL-Anweisung
1:
12.03.2010 15:30                    


mein Kopf kocht hier schon langsam :-)



Gruss


Martok - Fr 12.03.10 22:19

Dann probier mal einfache Anführungszeichen statt der doppelten. Das kann bei hinreichend seltsamen MySQL-Versionen vielleicht Probleme geben. Von welcher Version reden wir eigentlich?
Richtiger wären auch einfache, seh ich grade.

user profile iconhighlander78 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mir gerade nochmal die Datenbank angesehen und habe festgestellt dass das Datum in der "dtTime" Spalte direkt auf der Datenbank in diesem Format angezeigt wird:

Wie ich bereits mehrmals sagte, das native Text-Format für Datumswerte ist ISO 8601. Und genau so muss das dann auch in die Query.

Folgendes funktioniert bei mir auf einer Test-Tabelle, die ich noch rumstehen hatte:


SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
CREATE TABLE  `test`.`nslog` (
....
  `DATARATE` int(11NOT NULL,
  `CHANNEL` int(11NOT NULL,
  `DATEGMT` datetime NOT NULL,
  PRIMARY KEY  (`BSSID`,`DATEGMT`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



SQL-Anweisung
1:
2:
select dategmt from nslog
where date(dategmt) = '2007-10-23'


highlander78 - Fr 12.03.10 23:11

Die Datenbank ist auf Microsoft SQL SERVER 2005.

Habe 2 Screenshots , für mich reicht es heute :-)


Gruss


Martok - Fr 12.03.10 23:36

user profile iconhighlander78 hat folgendes geschrieben Zum zitierten Posting springen:
Die Datenbank ist auf Microsoft SQL SERVER 2005.

Ahja.
Und warum schreibst du dann in den Thread MySQL?


Mit sowas kenne ich mich nicht aus, sorry. Muss jemand anders ran...


highlander78 - Fr 12.03.10 23:45

Sorry dann war das mein Fehler...


highlander78 - So 14.03.10 17:42

Hat vielleicht jemad eine Idee..?
Habe das bis jetzt noch nicht gelöst..

Gruss


highlander78 - Mo 15.03.10 20:12

Also jetzt komme ich auf der SQL Datenbank an die Daten über Datum ran und zwar so:


SQL-Anweisung
1:
2:
3:
SELECT dtTime, lError, strPartNumber FROM dbo.V_PICKUPERROR6 
                       CONVERT(datetime, '15.03.2010 14:30'104
                   AND CONVERT(datetime, '15.03.2010 23:30'104)



jetzt wollte ich diese Abfrage in meine GetData funktion einbauen , aber leider bekomme ich keine ausgabe, und zwar so:


C#-Quelltext
1:
2:
3:
GetData("SELECT dtTime, lError, strPartNumber FROM dbo.V_PICKUPERROR6" +
                " CONVERT(datetime, '15.03.2005 14:30', 104)" +
                " AND CONVERT(datetime, '15.05.2005 23:00', 104)");



Was mache ich falsch ?


Gruss


Martok - Mo 15.03.10 20:54

Vergiss was hier stand, ich hab das C# nicht für voll genommen.

Syntaktisch ist das Statement eh sowieso völliger Blödsinn, aber wenn du sagst, es geht so...

Das Einzige, was mir einfallen würde, wäre dass GetData irgendwas mit dem Statement macht.


highlander78 - Mo 15.03.10 21:31

GetData sieht so aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void GetData(string selectCommand)
    {
        try
        {
            
            string connectionString = "SERVER=rbg70ret;UID=test;PWD=test;DATABASE=SiplaceOIS"
            
           
            dataAdapter = new SqlDataAdapter(selectCommand, connectionString);

            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
             DataTable table = new DataTable();
            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            dataAdapter.Fill(table);
            bindingSource1.DataSource = table;


highlander78 - Mo 15.03.10 21:33

Könnte mal jemand den Beitrag in das C# Forum verschieben.

Danke