COleDateTime allgemeines Problem



  • hm OK werde mir wohl auch mal ein paar MS-SQL Bücher organisieren müssen, vielleicht komm ich dann weiter! Aber für heute reicht es mir echt! Schnauze voll ich geh nach hause!
    Vielleicht find ich hier ja morgen früh die Wildcard-Lösung 😃 😉 😃



  • So, so finde ich alles von einem bestimmten Tag.

    Schaus dir an, Erklärung folgt nach meiner Mittagspause. 😉

    CString strTmp;
    			strTmp.Format(_T("(((Select DAY([LagerDat])) = %d) AND "), tmTemp.GetDay());
    			strFilter += strTmp;
    			strTmp.Format(_T("((Select MONTH([LagerDat])) = %d) AND "), tmTemp.GetMonth());
    			strFilter += strTmp;
    			strTmp.Format(_T("((Select YEAR([LagerDat])) = %d))"), tmTemp.GetYear());
    			strFilter += strTmp;
    


  • meinst du nicht dass deine Filterung nach 3 verschiedenen Kriterien unnötig Zeit kostet? Wäre es nicht schöner und sauberer es in etwa so zu tun?

    [ZeitStempel] >= '10.05.2005 00:00:00'  AND [ZeitStempel] <= '11.05.2005 00:00:00'
    

    Die Zeiten musste dann natürlich noch variabel einlesen, dazu würde ich so spontan sagen kannst du über setDateTime die Zeit einfach auf 00:00:00 setzen und dann einfach mit gleicher funktion für letzteren Wert day ++ machen!

    Vielleicht



  • Erstens hab ich das so wie du da geschrieben hast ja nicht hinbekommen (siehe gestern), zweitens wolltest du nach Uhrzeiten filtern, da ist das da und ein wenig lesen die halbe Miete. 🙂

    Hier sind alle Versuche bisher. Das auskommentierte geht aus verschiedenen Gründen nicht. (Hat kein Ergbnis oder gibt ne Meldung.)

    CString strTmp;
    			strTmp.Format(_T("(((Select DAY([LagerDat])) = %d) AND "), tmTemp.GetDay());
    			strFilter += strTmp;
    			strTmp.Format(_T("((Select MONTH([LagerDat])) = %d) AND "), tmTemp.GetMonth());
    			strFilter += strTmp;
    			strTmp.Format(_T("((Select YEAR([LagerDat])) = %d))"), tmTemp.GetYear());
    			strFilter += strTmp;
    
    // 			strFilter += _T("([LagerDat] BETWEEN \'" + tmTemp.Format(_T("%Y-%m-%d 0:00:00")) + "\' AND \'" + tmTemp.Format(_T("%Y-%m-%d 23:59:59")) + "\')");
    
    // 			strFilter += _T("([LagerDat] = CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d")) + "\',SQL_DATE))");
    
    // 			strFilter += _T("([LagerDat] LIKE CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d%%")) + "\',SQL_DATE))");
    
    // 			strFilter += _T("([LagerDat] LIKE \'" + tmTemp.Format(_T("%Y-%m-%d%%")) + "\')");
    
    // 			strFilter += _T("((([LagerDat] >= CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d 0:00:00")) + "\',SQL_TIMESTAMP))) AND");
    // 			strFilter += _T("(([LagerDat] <= CONVERT(\'" + tmTemp.Format(_T("%Y-%m-%d 23:59:59")) + "\',SQL_TIMESTAMP))))");
    


  • Hm also ich hab es jetzt so vor, wenn ich nen RDOButton drücke Mittagschicht dann mach ich

    m_sDatumVon = m_dtpVonDatum.Format("%d.%m.%Y 14:00:00");
             m_sDatumBis = m_dtpVonDatum.Format("%d.%m.%Y 22:00:00");
    

    und die zwei Strings füge ich dann einfach in meinen Stringfilter ein

    m_pSet->m_strFilter.Format(_T("[TIMESTAMP] >= \'%s\' AND <= \'%s\'"), m_sDatumVon , m_sDatumBis );
    

    P.S.: Das und ein bischen lesen die halbe Miete? Ich versteh nicht so ganz was du mir damit sagen willst.



  • Polofreak schrieb:

    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ß!

    Da klangst du so, als wenn das an jedem Tag die Zeit interessant wäre.
    Und dafür müßtest du das so ähnlich machen wie ich, nur mit der Zeit statt dem Datum. (Mit Datepart)



  • also ich hab hier grad noch ewig rumprobiert das wirklich auf alle Tage zu bringen, das was ich oben geschrieben hab, war allerdings blödsinn, wenn man will dass der Tag egal und uhrzeit fest ist. Ich hab gelesen bei Format kann man %% schreiben um ein % zu übergeben, dann wäre es ja

    m_dtpVonDatum.Format("%% 14:00:00");
    

    Eigentlich das was ich suche! aber ich komm damit auch nicht weiter! Ich hab dann versuch mal in nem einfachen Textstring ne Wildcard ein zu setzen und hab bemerkt, dass ich nicht einmal das kann! ich wollte was schreiben wie where Motornummer = 2C% aber alle Varianten sind gescheitert. kanst du mir sagen wie ich im strFilter mit ner MS-SQL-DB Wildcards allgemein einsetze??



  • Motornummer LIKE '2C%'



  • So, mein Datumsproblem ist gelöst:

    strTmp.Format(_T("([VerkDat] BETWEEN \'%s 0:00:00\' AND \'%s 23:59:59\')"), tmTemp.Format(_T("%Y-%m-%d")), tmTemp.Format(_T("%Y-%m-%d")));
    

    Ich hatte die Anführungszeichen um die Datumsangaben nicht. 🙄



  • hatte den vorlestzten Post nicht gelesen, mit motornummer like 2C% geht es leider auch nicht!
    Freut mich, dass es jetzt mit deiner Abfrage klappt, ich komm mit meinen Wildcards immernoch nicht weiter! Hast du schon mal Wildcards gesendet? Wenn ja kannst du mir mal die Query zeigen?



  • Und wenn du Anführungsstriche machst? Ist doch eine Zeichenkette. (Habs editiert.) 🙂

    Das funktioniert beim Datum leider nicht. 😞



  • auch bei einer Zeichenkette geht es nicht ich hab es ja genau deswegen erst mal an ner Zeichenkette probiert, aber dann kommt ungültiger deskriptorindex.



  • 😕

    Schau mal, diese Zeile habe ich eben ausprobiert - funktioniert.

    strFilter = _T("(Kunde_Nachname like \'" + m_strNachname + "%\')");
    


  • Juhu das geht! da werd ich morgen gleich mal genauer rein schauen was man da alles noch machen kann hast mir den feierabend gerettet. Vielen Dank
    Bis morgen



  • Gerne 🙂

    Solltest du rausfinden, wie das beim Datum geht, gib Bescheid.
    Momentan habe ich es da mit BETWEEN gelöst, aber irgendwie gefällt mir die Lösung nicht so ganz. 🙄



  • Ich bleib noch am Ball!
    Und wenn ein Tor fällt schrei ich ! 😃



  • ich hab zwar noch keine wirklich Lösung gefunden, aber neue Ansätze, mit denen ich bisher aber leider noch nicht wirklich erfolgreich war!

    1. starting with; Ich dachte mir ein starting with Datum sollte eigentlich alle Datensätze eines Tages anzeigen!

    2. IN; mit dem IN kann ich sagen, dass das in was ich danach in Klammern angebe im Feld enthalten sein muss. so sollte IN (05.05.2005) gleiches ergebnis wie oben bringen.

    3.Es gibt für datetime Typen sowas wie das hier:

    YEAR(EMENDATE) IN (YEAR(CURRENT DATE),
                         YEAR(CURRENT DATE - 1 YEAR),
                         YEAR(CURRENT DATE - 2 YEARS))
    

    Quelle ist hier

    4. sollte das mit Wildcard auch gehen, das Problem ist nur folgendes:

    For a TIMESTAMP: If the host variable is less than 19 bytes, an error occurs. If the length is less than 26, but greater than or equal to 19 bytes, trailing digits of the microseconds part of the value are omitted.

    Sprich ich muss den String den ich übergebe auf ne bestimmte Größe bringen!

    5. Timestamp kann konvertiert werden in Char, VarChar, ⚠ Date ⚠ Time dann kann man einen Stringvergleich bzw Date vergleich machen

    Ich werd noch ein wenig weiter forschen und wenn ich neuigkeiten hab melde ich mich



  • zu 1: Muss ich mal nachlesen, kenne ich nicht.
    zu 2: IN (05.05.2005) ist doch das Gleiche wie = 05.05.2005 😕
    zu 3: Das ist eine Hilfe zu DB2 - sicher, dass das identisch ist? Oder, wie so gerne, nur zu 90% und der Rest bricht einem das Genick? 🙄
    zu 4: Quelle? Und über den Satz muss ich mal in Ruhe nachdenken...
    zu 5: Wie konvertiert man das? DASS man das machen kann war mir ziemlich klar, nur wie ist die Frage. 😉



  • zu 2. ich dachte IN bedeutet soviel wie es muss enthalten sein also quasi %05.05.2005%
    zu 3. nein es kann schon sein dass es nur die 90% sind weiß ich leider nicht so genau
    zu 4. Quelle weiß ich nicht mehr muss nochmal schauen
    zu 5. Hast du ein Dynaset? da sollte sowas funktionieren:

    CString SQLStr = _T("select DATE(\'Zeitstempel\') from [dbo].[TRWErgebnisse]");
    	m_pSet->Close();
    	m_pSet->Open(NULL,SQLStr,NULL);
    

    aber es gibt dann noch CAST was glaube ich ganz gut ist oder convert
    MY-SQL ist auch nett mal anzuschauen
    schau mal im SQL ind 21 Tagen Verzeichnis [url]\SQL21\Sql_in_21_Tagen\KAP19.HTM[/url]
    [EDIT] noch was zu cast



  • Hab ne Lösung! Für meine Schichten und alles!

    Also das Zauberwort dafür heißt datepart(day,[zeitstempel]) wenn ich das im SQL-Server mache, dann bekomm ich den Tag vom Timestamp! schön gell!
    wenn ich jetzt meine Schicht will, dann mach ich folgendes:

    datepart(hour,[zeitstempel])+2)%24/8+1
    

    Jetzt hab ich schicht 1 gleich Nacht 2 Früh drei Mittag.

    Jetzt kommt allerdings das aber!

    Der ODBC-Treiber unterstützt keine Dynasets, sprich du kannst das ganze nicht in deinen WHERE einbauen! Ist etwas scheiße, aber du musst jetzt mittels einem anderen Tool eine virtuelle Spalte in der DB anlegen die ein kalkuliertes Feld ist. dieses Feld entsteht dann bei Abfrage nach obiger Formel. Wenn du kein richtig schönes MS-DB-Verwaltungstool hast schau mal hier
    Mit dem Tool kannst du soooo viel geile Sachen machen der bildet dir auch richtig schöne SQL-Querys nach Clickibundi und und und wenn du als kein richtig geiles hast schau es dir unbedingt an!


Anmelden zum Antworten