2012-04-12 7 views
1

Ich habe ein Problem beim Vergleichen eines Datums in einer Access-Datenbank. Im Grunde analysiere ich ein Datum aus einem Textfeld und versuche dann, dieses Datum mit einem anderen zu vergleichen, um nur neuere/ältere Datensätze zu ziehen.Vergleichen von Datumswerten in Access - Datentypkonflikt in Kriterien Ausdruck

Bisher habe ich alles funktioniert, aber wenn ich versuche, der where-Klausel den Ausdruck hinzuzufügen, verhält es sich so, als wäre es kein Datumswert.

hier ist die volle SQL:

SELECT 
Switch(Isdate(TRIM(LEFT(bc_testingtickets.notes, Instr(bc_testingtickets.notes, ' ')))) = false, 'NOT  ASSIGNED!!!') AS [Assigned Status], 
TRIM(LEFT(bc_testingtickets.notes, Instr(bc_testingtickets.notes, ' '))) AS [Last Updated Date], 
bc_testingtickets.notes AS [Work Diary], 
bc_testingtickets.ticket_id, 
clients.client_code, 
bc_profilemain.SYSTEM, 
list_picklists.TEXT, 
list_picklists_1.TEXT, 
list_picklists_2.TEXT, 
list_picklists_3.TEXT, 
bc_testingtickets.createdate, 
bc_testingtickets.completedate, 
Datevalue(TRIM(LEFT([bc_TestingTickets].[notes], Instr([bc_TestingTickets].[notes], ' ')))) AS datetest 

FROM list_picklists AS list_picklists_3 
RIGHT JOIN (list_picklists AS list_picklists_2 
      RIGHT JOIN (list_picklists AS list_picklists_1 
         RIGHT JOIN (bc_profilemain 
            RIGHT JOIN (((bc_testingtickets 
                LEFT JOIN clients 
                ON 
bc_testingtickets.broker = clients.client_id) 
       LEFT JOIN list_picklists 
       ON 
bc_testingtickets.status = list_picklists.id) 
      LEFT JOIN bc_profile2ticketmapping 
       ON bc_testingtickets.ticket_id = 
        bc_profile2ticketmapping.ticket_id) 
    ON bc_profilemain.id = 
     bc_profile2ticketmapping.profile_id) 
ON list_picklists_1.id = bc_testingtickets.purpose) 
ON list_picklists_2.id = bc_profilemain.destination) 
    ON list_picklists_3.id = bc_profilemain.security_type 
WHERE (((list_picklists.TEXT) <> 'Passed' 
    AND (list_picklists.TEXT) <> 'Failed' 
    AND (list_picklists.TEXT) <> 'Rejected') 
    AND ((bc_testingtickets.ticket_id) <> 4386)) 
GROUP BY bc_testingtickets.notes, 
    bc_testingtickets.ticket_id, 
    clients.client_code, 
    bc_profilemain.SYSTEM, 
    list_picklists.TEXT, 
    list_picklists_1.TEXT, 
    list_picklists_2.TEXT, 
    list_picklists_3.TEXT, 
    bc_testingtickets.createdate, 
    bc_testingtickets.completedate, 
    DateValue(TRIM(LEFT([bc_TestingTickets].[notes], Instr([bc_TestingTickets].[notes], ' ')))) 
ORDER BY Datevalue(TRIM(LEFT([bc_TestingTickets].[notes], Instr([bc_TestingTickets].[notes], ' ')))); 

der Wert i vor einem verschiedenen Zeitpunkt dies zu vergleichen bin versucht:

DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) 

wenn ich einen Abschnitt der where-Klausel hinzufügen, wie unten, Ich bekomme den Datentyp Mismatch-Fehler:

WHERE DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > #4/1/2012# 

Ich habe sogar versucht, mit der DateValue-Funktion um das Handbuch d aß teste ich mit, aber ich immer noch den Mismatch Fehler:

WHERE DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > DateValue("4/1/2012") 

irgendwelche Tipps, wie ich ein Datum in diesem Verfahren vergleichen? Ich kann keine Felder in der Datenbank ändern, ect, deshalb analysiere ich das Datum in SQL und versuche, es zu manipulieren, also kann ich Berichte gegen es laufen lassen.

Ich habe versucht zu googeln, aber nichts spricht speziell über das Parsen eines Datums aus dem Text und das Konvertieren in ein Datumsobjekt. Ich denke, es könnte ein Fehler sein oder die Art, wie das Datum von der linken/Trim-Funktionen zurückgegeben wird. Sie können sehen, ich habe eine Spalte an das Ende der SELECT-Anweisung namens DateTest hinzugefügt und es ist offensichtlicher Zugriff behandelt es wie ein Datum (wenn die Abfrage ausgeführt wird, fragt es nach ältesten nach neuesten/neuesten zu ältesten statt AZ zu sortieren oder ZA), anders als die zweite Spalte in der Auswahl.

Vielen Dank im Voraus für alle Tipps/Hinweise, wie ich auf der Grundlage des Datums abfragen kann.

edit: Ich hat versucht, nur die folgenden Anweisungen in meiner where-Klausel und eine Nichtübereinstimmung noch immer:

CDate(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > #4/1/2012# 
CDate(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[notes],' ')))) > 
CDate("4/1/2012") CDate(DateValue(Trim(Left([bc_TestingTickets].[notes],InStr([bc_TestingTickets].[‌​notes],' '))))) > #4/1/2012# 

i mit allen verschiedenen Kombinationen habe ich versucht, die in Bezug auf Putting CDate innerhalb von DatWert denken kann, draußen, ect. Die CDate-Funktion sieht jedoch so aus, als ob ich sie verwenden sollte. nicht sicher, warum es immer noch den Fehler wirft.

Hier ist ein Link zu einem Screenshot mit den Ergebnissen der Abfrage http://ramonecung.com/access.jpg. Es gibt zwei Screenshots in einem Bild.

+0

Ist das http://stackoverflow.com/questions/9901972/how-can-i-sort-by-date-in-ms-access-2007/9904722#9904722 jede Hilfe? – Fionnuala

Antwort

0

Sie gemeldet Sie Data Type Mismatch Fehler mit dieser erhalten Klausel WHERE.

WHERE DateValue(Trim(Left([bc_TestingTickets].[notes], 
    InStr([bc_TestingTickets].[notes],' ')))) > #4/1/2012# 

, die mich fragen, ob [bc_TestingTickets].[notes] immer Null sein kann, entweder weil der Tabellenentwurf für dieses Feld Null erlaubt, oder NULL-Werte werden durch das Design verboten, aber sind in der Reihe der Abfrage von in Frage kommenden Zeilen als Ergebnis LINKS oder RECHTS JOIN.

Wenn Nulls vorhanden sind, um Ihre Situation zu dieser einfachen Abfrage ähnlich sein können, die auch den Datentyp Mismatch Fehler auslöst:

SELECT DateValue(Trim(Left(Null,InStr(Null,' ')))); 

Wenn das die Ursache des Problems erweist, müssen Sie entwerfen irgendwie darum herum. Ich kann keinen Vorschlag darüber machen, wie Sie das tun sollten. Der Versuch, deine Frage zu analysieren, hat mich verscheucht. :-(

+0

Ich denke, das ist das Problem. Ich werde weiter herumfummeln und schauen, ob ich eine if (! Isnull (bla bla) Linie zum arbeiten bekomme. Hier ist Hoffnung! – ramonecung

0

Es scheint, als ob Sie ein Problem mit der type conversion haben. In diesem Fall glaube ich, dass Sie nach dem CDate function suchen.

+0

ich gerade versucht die folgenden Anweisungen in meiner where-Klausel und immer noch einen Mismatch erhalten: CDate (Trim (Links ([bc_TestingTickets]. [Hinweise], InStr ([bc_TestingTickets]. [Hinweise], '')))) # 4/1/2012 # CDate (Trimmen (Links ([bc_TestingTickets]. [Notizen], InStr ([bc_TestingTickets]. [Notizen], '')))) CDate ("4/1/2012") CDate (DateValue (Trim (Links ([bc_TestingTickets]. [Notizen], InStr ([bc_TestingTickets]. [Notizen], '')))))> # 4/1/2012 # Ich versuchte mit all den verschiedenen Kombinationen, die ich mir vorstellen konnte Die CDate - Funktion sieht zwar so aus, wie ich sie benutzen sollte, aber ich bin mir nicht sicher, warum sie immer noch die Error. – ramonecung

+0

@ramonecung: Können Sie Ihren Beitrag mit dem, was Sie versucht haben, aktualisieren? Kann Ihr Code auch über einen sql Formatierer (http://www.dpriver.com/pp/sqlformat.htm) und Ihren Post aktualisieren? - Es macht es viel einfacher für den Rest von uns zu lesen. :) –

+0

@ramonecung: Wenn Sie einen Datentyp nicht übereinstimmen, bedeutet dies, dass Daten analysiert werden, während Ihre trim/linken Funktionen keine Daten sind. Eine Möglichkeit zur Problembehandlung besteht darin, eine einfache SELECT-Abfrage zu erstellen, die versucht, die Daten ohne Vergleich abzurufen. Beginnen Sie ab diesem Zeitpunkt mit der Arbeit mit Ihrem IIF (ISDATE (CDATE (TRIM (Links, bis Sie einen Punkt erreicht haben, an dem saubere Daten analysiert werden. –

0

Ein Problem könnte die Reihenfolge der Datumsteile sein. Ein Test in den Direkt-Fenstern zeigt diese

 
?cdate(#4/1/2012#) 
01.04.2012 

?cdate(#2012/1/4#) 
04.01.2012 

die Daten schreiben rückwärts im Format yyyy/MM/dd und somit nicht unverhofft Austausch von Tagen und Monaten zu vermeiden!

DateValue("2012/1/4") 

und

CDate(#2012/1/4#) 
Verwandte Themen