55097


お世話になります。

MicrosoftAccess2010でSQLを記述しているときに、現在の日時(`NOW()`)と、日付フィールドの値を`DATEADD`で加算した日付を比較すると、『比較条件の型が一致しません』とのエラーになります。

DATEADD関数が返す値は日付型だったと思うのですが、これがなぜエラーなのかが解りません。  
原因と対策をお教えいただけますでしょうか。

記述はこのようになっています。

[code]

    SELECT * FROM tmp1 WHERE NOW() < DATEADD('m',7,visited_dt<日付型のフィールドyyyy/mm/dd hh:nn:ssの形式>)
    ↑失敗
    
    SELECT * FROM tmp1 WHERE NOW() < visited_dt
    ↑これならOK、まぁ当たり前ですが。
    
    SELECT * FROM tmp1 WHERE NOW() < CDATE(DATEADD('m',7,visited_dt))
    ↑これもNG。エラー内容は同じ
    
    UPDATE tmp1 SET a = DATEADD('m',7,visited_dt)
    SELECT * FROM tmp1 WHERE NOW() < a
    ↑二回に分けて行った結果、これならOK。
    
[/code]

よろしくお願いいたします。


CC BY-SA 4.0
2019-05-19T01:15:44.270
55078
2020-02-22T16:28:52.267
2020-02-22T16:28:52.267
3060
9374
question
sql ms-access
AccessのSQLでDateAdd関数と日付を比較すると『比較条件の型が一致しません』とのエラー


Access2016で検証してみました。  
クエリではDateaddしても結果は返しましたがVBAでは多分失敗すると思います。

理由は下記になります。  
<https://support.office.com/ja-
jp/article/dateadd-%E9%96%A2%E6%95%B0-63befdf6-1ffa-4357-9424-61e8c57afc19>  
ここを参照すると戻り値はVariant型になっています。

今回実行しようとしているSQLの形にしようとするならば一度Dateadd後に日付型に意図的に変換した後に実行する方法が簡単だと思います。

[code]

    Dim visited_dt As Date
    Dim AddDate_dt As Date
    
    visited_dt = #5/20/2019#
    AddDate_dt = DateAdd("m", 7, visited_dt)
    
[/code]

いかがでしょうか？

追記  
まずバグの可能性を疑ってみてサービスパックは適用されていますか？  
<https://support.microsoft.com/ja-jp/help/2687455/description-of-
office-2010-service-pack-2>

続いて  
Access2007で再度検証してみました。  
テストテーブルを作ってみました。

クエリで1行ずつ実行しました

[code]

    create table tmp2 (id integer , visited_dt datetime);
    insert into tmp2 values (1,#2018/10/19#);
    insert into tmp2 values (2,#2018/10/20#);
    insert into tmp2 values (3,#2018/10/21#);
    SELECT * FROM tmp2 WHERE Now()< DateAdd('m',7,visited_dt);
    
[/code]

この構成で必要な要件を満たしていればいいのですが、、、  
結果は2019/05/20現在で2018/10/21のレコードのみ抽出されたのを確認しました。  
上記のSQLでテストテーブルでSELECTまで確認してみてはいかがでしょうか？  
実行されれば本番SQLのどこかに不具合がありそうです。


CC BY-SA 4.0
2019-05-19T23:51:31.757
55097
2019-05-20T14:22:23.117
2019-05-20T14:22:23.117
28931
28931
55078
answer