5

Informix に対して次の db コマンドを実行しようとしています。

delete from table1
    where u_id in (select u_id
                     from table2
                    where c_id in (select c_id
                                     from ptable
                                    where name = 'Smith'
                                      and dob = '29-08-1946'));

これを文字列として MS Data Application ブロックの db.ExecuteNonQuery メソッドに渡すと、上記のエラーが発生しますか?

4

4 に答える 4

12

日付形式「29-08-1946」を機能させるには、DBDATE 環境変数を「DMY4-」(または「DMY4/」) などの値に設定する必要があります。これらは英国の標準的なバリエーションです (私は何年も使用していましたが、現在は "Y4MD-" のみを使用しています。これは、他の誰かの環境をデバッグする場合を除いて、ISO 8601:2004 (日付形式) と ISO 9075 (SQL) の両方に一致します)。日付の書式設定に影響を与える可能性のある環境変数は他にもありますが、実際にはかなり多くの環境変数がありますが、DBDATE は他の変数よりも優先されるため、問題を解決するのは大きなハンマーです。

問題の 1 つは、プレーン文字列を使用した表記が、DBDATE の US と UK (および ISO) 設定の間で移植できないことです。選択肢がある場合、日付の中立コンストラクターは MDY() 関数です。

WHERE dob = MDY(8,29,1946)

これは、DBDATE の設定に関係なく機能します。おそらく TO_DATE() も使用できます。

SELECT TO_DATE('29-08-1946', '%d-%m-%Y') FROM dual;

これにより、'1946-08-29 00:00:00.00000' が生成されました。関数は DATETIME YEAR TO FRACTION(5) 値を生成しますが、Informix では確実に DATE 値に変換されます。

DATE() 関数または DATE への明示的なキャスト (CAST('29-08-1946' AS DATE) または '29-08-1946'::DATE) を使用することもできますが、どちらもユーザーのロケールの気まぐれ。

于 2009-10-13T22:03:32.710 に答える
1

日付文字列の日と月の部分が読み込まれる方法は、コンピューターのカルチャ設定によって異なります。

日付文字列を「dd-MMM-yyyy」の形式でデータベースに渡す方が常に安全です(つまり、「29-aug-1946」)。

于 2009-10-13T16:04:43.187 に答える
1

日付フィールドの形式が正しくありません。1946 年には 29 番目の月がないため、エラーの原因となっています。

月と日を入れ替えてみました。1946 年 8 月 29 日。

于 2009-10-13T15:35:53.807 に答える
1

それらを YYYY-MM-DD として渡す方が安全です。その例の dd-MMM-yyyy は、(たとえば) フランス語ロケールのサーバーでは失敗します。

于 2009-10-13T16:15:18.640 に答える