COleDateTime allgemeines Problem
-
Hi zusammen ich hab allgemein Verständnis Probleme mit COleDatetime.
Es geht um folgendes:
Ich habe eine DB aus der ich ein Timestamp hole, welches ich in einer COleDatetime Variable speichere. Jetzt will ich eine Suchanfrage machen, sowas wie select.... where timestamp = 09.05.2005 aber wenn ich meinen m_strFilter in etwa so setze:m_pSet->m_strFilter = _T("[TIMESTAMP] = 06.05.2005");
dann gibt er mir immernoch den kompletten Recordset aus!er Filtert also überhaupt nicht. wie kann ich nach Datum filtern oder sortieren, oder kann ich irgendwas wie [timestamp].getDay machen?
Problem: Wie filtere oder sortiere ich einen Recordset nach Datum?
-
Ich glaube, das Problem liegt in dem Fall auf der SQL-Seite.
Das SQL versteht das Datum da nicht.Ich hab dir mal was aus meinem Code rausgesucht, versuch das mal an deins anzupassen:
strFilter += _T("([Verk_Dat] = CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d")) + "\',SQL_DATE))");
-
AAAAAAAAhhhh Erklärung?
Also das versteh ich leider mal überhaupt nicht!strFilter += _T("([Verk_Dat] = CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d")) + "\',SQL_DATE))");
also das versteh ich: der Filter += folgender String. Der String ist dann der Spaltenname = und jetzt geht es los mit den Problemen. Wenn ich jetztconvert auf das oben mache steht in meinem Filter das datum drin, welches in aktuellem Datensatz steht. Ich will doch aber meinen eingegebenen mit dem Datum in der DB vergleichen!
Bitte hilf mir deine Zeile zu verstehen, ich kann sie compilieren aber nichts damit anfangen weil ich sie nicht verstehe![Edit] OK sorry falsche Variable, wenn ich meine COleDateTime Variable nehm, geht es zwar, aber Problem s.o. wenn ich nun aber meine Sucheingabe nehme, dann ist das ein CString und dann geht es nicht mehr.
error C2111: pointer addition requires integral operand
Für folgende Zeile:
m_pSet->m_strFilter = _T("([%s] = CONVERT(\'" + m_sSuchen.Format(_T("%Y-%m-%d")) + "\',m_sSearchBy, SQL_DATE))");
-
CONVERT ist eine SQL Funktion.
Am besten, man guckt sich sowas schrittweise an:
COleDateTime tmTemp = COleDateTime::GetCurrentTime(); strFilter += _T("([Verk_Dat] = CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d")) + "\',SQL_DATE))");
So, nun dröseln wir das mal auf...
Als erstes führen wir mal das "Format" aus:strFilter += _T("([Verk_Dat] = CONVERT(\'2005-05-09\',SQL_DATE))");
Wenn man sich nun das anguckt, was das SQL zu sehen bekommt, ist es auch deutlich verständlicher:
CONVERT('2005-05-09',SQL_DATE)
Ich verstehe das als "Mach aus der Zeichenkette ein für SQL verständliches Datum".
Ich hab das hier aus dem Forum, aber die Suche mag mich nicht.
War die Erklärung verständlich?
-
prinzipiell verstanden; Ja!
Erklärung war gut.
ABER---------------------------
ACRSQL
---------------------------
Zeile 1: Falsche Syntax in der Nähe von '06.05.2005'.
Anweisung(en) konnte(n) nicht vorbereitet werden.---------------------------
OK
---------------------------Ich hab als Datumstyp erst deines versucht mit 2005-05-06 dann das oben und ähnliche, aber nichts funktioniert! hab genau die Zeile von dir genommen. Schau mal hier:
m_pSet->m_strFilter = _T("([%s] = CONVERT(\'06.05.2005\',SQL_DATE),m_sSearchBy)"); m_pSet->Requery(); m_sResult = m_pSet->m_strFilter;
-
ich habe übrigens in der DB Datum und Uhrzeit stehen, macht das einen Untersched? muss ich für die Zeit quasi ne Wildcard setzen? wenn ja wie?
-
Hmm, also das letzte wird wohl nicht gehen, weil es verdreht ist... Das Jahr muss glaubich nach vorne *buchsuch*
So, aus dem Nitty-Gritty-SQL:
Access und MS-SQL erwarten Datumskonstanten im Format YYYY-MM-DD HH24:MI:SS zB. '2000-11-17 23:53:01'.Allerdings muss man angeben, wie die Vorlage für das spätere Datum aussieht. Leider hat das Buch keine schön aussehenden Konstanten.
YYYY-MM-DD HH24:MI:SS braucht die Zahl 120 statt SQL_DATE.
Es gibt dann noch eine Funktion to_date, die kann man sich ja angucken, wenns jetzt nicht klappt.
-
also ich hab da folgendes gefunden:
SQL_TYPE_TIMESTAMP 1992-12-31 23:45:55.12
SQL_C_CHAR (23-Bufferlength) 1992-12-31 23:45:55.12\0 [a] n/a
SQL_TYPE_TIMESTAMP 1992-12-31 23:45:55.12
SQL_C_CHAR (22-Bufferlength) 1992-12-31 23:45:55.1\0 [a] 01004
SQL_TYPE_TIMESTAMP 1992-12-31 23:45:55.12
SQL_C_CHAR (18-Bufferlength) ---- 22003zu finden in der MSDN unter dem Stichwort "SQL to C Data Conversion Examples"
und unter "SQL versus C++ data types" findet man dass ein SQL Timestamp in C++ ein CTimeobjekt oder ein CString sein kann.
Boa ich muss jetzt erst mal RUHE BEWAREN! Ich dreh sonst echt durch mit der scheiße.
[Edit]
Wollte nämlich grad sagen wenn ich in der Suche 07.04.2005 12:08:57 eingebe, dann geht es. Aber jetzt hab ich es grad versucht und es geht eben nicht! (es ging aber mal!)
[Es geht doch hatte nur ' blabla ' vergessen] [\Edit]Zusammenfassung:
Mein Datum dass ich aus der DB hole und in einem Editfeld ausgebe hat folgendes Format:
07.04.2005 12:08:57Wenn ich suche nach '07.04.2005 12:08:57' geht die Suche ich will aber die Zeit weglassen können, also '07.04.2005' und alle an dem Datum erhalten, egal welche Zeit.
BITTE HELFEN
-
Dann nimm im Filter statt = ein LIKE und hinter dem Datum das entsprechende Wildcard Zeichen der Datenbank.
-
Und falls das nicht klappt, sich nach allem zwischen 0:00:00 und 23:39:39
-
OK und das sieht wie aus? Ich habe eine MS-SQL Datenbank der Datumstyp ist Timestamp. Anfrage nach alles am Tag 06.05.2005?
Bekomm das nämlich nicht hin! Weil er immer meckert, er kann das nicht in ein Datetimeobjekt wandeln.
Danke für die Hilfe!
-
Ist die Meldung vielleicht so ähnlich?
Line 1: Incorrect syntax near '2005-04-07'. Statement(s) could not be prepared.
So langsam kam mir nämlich der Verdacht, dass ich das Codestück auf dem MS-SQL noch nicht getestet hatte und Pervasive hatte einen echten Datumstyp, ohne Zeit.
So ein Mist, das hätte ich doch NIE gefunden.
-
Also ich hab es jetzt wirklich mit >=00:00:00 <=nächsterTag 00:00:00 aber schön ist das nicht, mit Wildcards wäre das viel geiler! denn ich will ja auch machen könne alle Teile der Mittagschicht, also Tag Woche Jahr egal Zeit >=14:00:00 <= 22:00:00 mit Wildcards kein Thema mit der Variante von jetzt ein Problem mit schleifen und scheiß!
-
Zeig mal den Code bitte, ich kriegs nicht hin.
// strFilter += _T("([Verk_Dat] = CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d")) + "\',SQL_DATE))"); strFilter += _T("([Verk_Dat] LIKE CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d%%")) + "\',SQL_DATE))"); // strFilter += _T("((([Verk_Dat] >= CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d 0:00:00")) + "\',SQL_TIMESTAMP))) AND"); // strFilter += _T("(([Verk_Dat] <= CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d 23:59:59")) + "\',SQL_TIMESTAMP))))");
Alle drei Versionen geben eine ähnliche Fehlermeldung.
-
öhm wenn ich ehrlich bin mach ich das viel einfacher! Wenn du oben nochmal liest kann man auch einfach einen CString übergeben, und das mach ich auch: ich hab so ne SQL zusammenclick-Maske, und in der clickere ich mir folgenden String für meinen Filter zusammen, so dass sich ergibt:
m_pSet->m_strFilter = _T(" [ZeitStempel] >= '06.05.2005 00:00:00' AND [ZeitStempel] <= '07.05.2005 00:00:00'");
oder natürlich
m_pSet->m_strFilter = _T(" [ZeitStempel] BETWEEN '06.05.2005 00:00:00' AND '07.05.2005 00:00:00'");
-
Bei mir steht dann drin:
([LagerDat] LIKE '2005-04-07%')
Die Klammern sind da, weil das Lagerdatum nur eine von 5 möglichken Sachen ist.
Aber ich kriege nix.Edit: Okay, das Problem liegt im Recordset.
Direkt im Manager bekomme ich zuSELECT * FROM Buch WHERE (LagerDat BETWEEN '2005-04-07 0:00:00' AND '2005-04-07 23:59:59')
auch das gesuchte. Na, ich such denn mal...
-
mach mal sicherheitshalber und nur als versuch
strFilter = ID >=0; requery();
Ich hatte auch schon oft nen Filter noch gesetzt und dann brachte er nur schrott
-
Wegen dem Problem, dass du Uhrzeiten abfragen willst...
Ich habe hier gerade die MS-SQL Funktion DATEPART entdeckt.Wegen der Handhabung gucke ich grade mal...
-
juhu! Woher bekommst du MS-SQL-Funktionen?
Ich hab keine Ahnung wo ich da suchen soll! wohl weniger über die MSDN!
-
Ich hab hier MS-SQL Server in 21 Tagen liegen.
Nur teilweise hilftreich, aber immernoch besser als das BlackBook.
Es gibt dann noch die SQL Books Online: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/startsql/getstart_4fht.asp
Hier scheint leider einiges offline zu sein: http://www.dhruvaraj.com/Database/SQLServer.htm