私は11月に起こったすべての日付の表を持っています。私はこの質問を書きました
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-04-12'
このクエリは、11月(11月)に発生したすべてのものを返す必要があります。これは、の前の日付 '2013-04-12'(12月)
しかし、それは04より短い日に起こった利用可能な日付を返すだけです(2013 - 04 - 12)
それは日中の部分を比較しているだけなのでしょうか。丸一日じゃない?
これを修正するには?
Created_dateの型はdateです。
日付形式はデフォルトでyyyy-dd-MMです。
その意味が地域の文化に依存する '2013-04-12'の代わりに、文化の不変形式として認識されている '20130412'を使用してください。
12月4日と比較したい場合番目、あなたは '20131204'と書くべきです。 4月12日と比較したい場合番目、あなたは '20130412'と書くべきです。
SQL Serverのドキュメントの 国際的なTransact-SQLステートメントの記述 では、カルチャに依存しないステートメントの記述方法について説明しています。
他のAPI、またはTransact-SQLスクリプト、ストアドプロシージャ、トリガを使用するアプリケーションは、分離されていない数値文字列を使用する必要があります。例えば、yyyymmddは19980924です。
編集
ADOを使用しているので、最良のオプションはクエリをパラメータ化し、日付パラメータとして日付値を渡すことです。これにより、フォーマットの問題を完全に回避し、パラメータ化クエリのパフォーマンス上の利点も得られます。
UPDATE
ISO 8601フォーマットをリテラルで使用するには、すべての要素を指定する必要があります。 datetimeのドキュメントのISO 8601セクションから引用する
ISO 8601フォーマットを使用するには、フォーマット内の各要素を指定する必要があります。これには、形式で示されているT、コロン(:)、およびピリオド(。)も含まれます。
...第二成分の端数はオプションです。時間コンポーネントは24時間形式で指定されます。
こんな感じ
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-12-04'
日付の値とだけ比較している場合、それを日付に変換する(datetimeではない)場合はうまくいく
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= convert(date,'2013-04-12',102)
この変換は、GetDate()関数の使用中にも適用されます。
あなたは<=
を入れます、そしてそれは与えられた日付もキャッチします。あなたはそれを<
だけで置き換えることができます。
以下のクエリで試してください
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
convert(datetime, convert(varchar(10), created_date, 102)) <= convert(datetime,'2013-04-12')
日付の前後に「#」を使用し、システムの日付形式を確認してください。多分 "YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O USING '/ O \'"
例:
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= #2013-04-12#
日付形式はyyyy-mm-ddです。そのため、上記のクエリは12Apr2013より古いレコードを探しています。
日付文字列を '2013-04-30'に設定してクイックチェックを実行することをお勧めします。SQLエラーがない場合、日付形式はyyyy-mm-ddに確認されます。