none
Access 2013 Abfrage / MSSQL Datum

    Frage

  • Hallo

    ich habe eine "abfrage" die ich mit einer Datenherkunft MdB/accdb ausführen kann aber mit einer ODBC Anbindung an eine MSSQL DB leider nicht

    WHERE (((tblAufkopf.MahnungsDatum)<=Date()-[TAGEzwischenMahnung]))  

    Problem macht das Kriterium

    <=(Date()-[TAGEzwischenMahnung]) 

    wenn ich aber

    WHERE (((tblAufkopf.MahnungsDatum)<=Date()-1)

    benutze geht es

    Fehlermeldung ist datetime2 ist inkompatibel mit tinyint

    wie kann ich das lösen

    Mittwoch, 12. November 2014 07:10

Antworten

  • Danke für den Lösungsansatz meine Lösung ist

    WHERE (((tblAufkopf.MahnungsDatum)<=DateAdd("d",-[TAGEzwischenMahnung],Date()))

    damit geht es

    • Als Antwort markiert MCDPone Mittwoch, 12. November 2014 15:59
    Mittwoch, 12. November 2014 15:59

Alle Antworten

  • Der SQl Server Datentyp datetime2 (neu seit SQL Server 2008) wird in einer ODBC-verlinkten Tabelle nur als String erkannt. Man muss also zuerst nach Datum konvertieren, wobei zu beachten ist, dass datetime2 zusätzlich noch Millisekunden hat, die man zuerst abschneiden muss. Also versuche es einmal mit

    CDate(Left([TAGEzwischenMahnung], InStr([TAGEzwischenMahnung], ".") - 1))

    Matthias Kläy, Kläy Computing AG

    Mittwoch, 12. November 2014 08:52
  • Danke für den Lösungsansatz meine Lösung ist

    WHERE (((tblAufkopf.MahnungsDatum)<=DateAdd("d",-[TAGEzwischenMahnung],Date()))

    damit geht es

    • Als Antwort markiert MCDPone Mittwoch, 12. November 2014 15:59
    Mittwoch, 12. November 2014 15:59
  • Zwei allgemeine Hinweise:

    Der SQl Server Datentyp datetime2 (neu seit SQL Server 2008) wird in einer ODBC-verlinkten Tabelle nur als String erkannt.

    Das gilt für den {SQL Server}-Treiber, der aus 2000 stammt und die neuen Datentypen deshalb nicht kennt. Wenn man den Native Client aus der passenden Version verwendet, werden DateTime2 usw richtig erkannt.

    Man muss also zuerst nach Datum konvertieren, wobei zu beachten ist, dass datetime2 zusätzlich noch Millisekunden hat, die man zuerst abschneiden muss. Also versuche es einmal mit

    CDate(Left([TAGEzwischenMahnung], InStr([TAGEzwischenMahnung], ".") - 1))

    Die Ursache an der Stelle ist, dass es sich bei der WHERE-Bedingung um einfache Algebra handelt und deshalb vom ODBC-Treiber an den Server durch gereicht wird, wo Datum/Long-Operationen ohne vorherige Konvertierung nicht erlaubt sind.

    Durch das am Server unbekannte CDate wird ODBC gezwungen, die Daten zur Ausführung an den Client zu schicken. Normalerweise sollte man soviel wie möglich den Server machen lassen, aber an der Stelle ist das genau die Lösung. Wenn man den Native Client verwendet, könnte man sich die String-Operation sparen.

    Gruss - Peter
    Mittwoch, 12. November 2014 21:40
    Moderator