1

アクセスデータベースの日付を比較する際に問題が発生しました。基本的に、テキストフィールドから日付を解析し、その日付を別の日付と比較して、新しい/古いレコードのみを取得しようとしています。

これまでのところすべてが機能していますが、where句に式を追加しようとすると、日付値ではないように動作します。

これが完全な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], ' ')))); 

さまざまな日付と比較しようとしている値は次のとおりです。

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

以下のようにwhere句にセクションを追加すると、データ型の不一致エラーが発生します。

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

テストしている手動の日付の前後でDateValue関数を使用しようとしましたが、それでも不一致エラーが発生します。

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

この方法で日付を比較する方法に関するヒントはありますか?データベースのフィールドを変更することはできません。そのため、SQLで日付を解析し、それに対してレポートを実行できるように操作しようとしています。

グーグルを試しましたが、テキストから日付を解析して日付オブジェクトに変換することについて具体的には何も話していません。バグか、left/trim関数から日付が返される方法の可能性があると思います。DateTestというSELECTステートメントの最後に列を追加したことがわかります。これは、アクセスが日付のように扱われていることは明らかです(クエリを実行すると、AZではなく古いものから新しいもの/新しいものから古いものの順に並べ替えるように求められます)またはZA)、selectの2番目の列とは異なります。

日付に基づいてクエリを実行する方法に関するヒント/手がかりを事前に感謝します。

編集:where句で次のステートメントを試しましたが、それでも不一致が発生します:

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# 

CDateをDateValueの内側、外側などに配置することに関して考えられるさまざまな組み合わせをすべて試しました。CDate関数は私が使用すべきもののように見えます。それでもエラーが発生する理由がわかりません。

クエリの結果を示すスクリーンショットへのリンクは次のとおりですhttp://ramonecung.com/access.jpg。1つの画像に2つのスクリーンショットがあります。

4

3 に答える 3

0

型変換に問題があるようです。この場合、あなたはCDate 関数を探していると思います。

于 2012-04-12T20:44:18.260 に答える
0

日付部分の順序に問題がある可能性があります。イミディエイト ウィンドウでのテストは、これを示しています。

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

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

フォーマットで日付を逆に書くことでyyyy/MM/dd、日と月の不用意な交換を避けることができます!

DateValue("2012/1/4")

CDate(#2012/1/4#)
于 2012-04-12T21:41:52.777 に答える
0

この WHERE 句で Data Type Mismatch エラーが発生したと報告しました。

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

[bc_TestingTickets].[notes]テーブルの設計でそのフィールドの Null が許可されているか、設計では Null が禁止されているが、LEFT または RIGHT JOIN の結果としてクエリの候補行のセットに存在するため、Null になる可能性があるかどうか疑問に思います。

Null が存在する場合、状況は次の単純なクエリに似ている可能性があり、データ型の不一致エラーもトリガーされます。

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

それが問題の原因であることが判明した場合は、何らかの方法でそれを回避するように設計する必要があります。どのようにすればよいかについての提案はできません。あなたのクエリを分析しようとすると、私は怖くなりました。:-(

于 2012-04-13T18:00:45.343 に答える