で私を助けているあなたの問題が明らかに何をするかDATEPART
上の誤解、そしてどのように日付を比較することです。だから、あなたのWHERE
句を分解しましょう。
where
datepart(yy,doe)>= datepart(yy,dateadd(yy,-2,'2012/04/10'))
この句は、ユーザーが提出した日付を表す、固定日に2年前の日付の年と列DOEの日付の年の値を比較します。したがって、datepart(yy, dateadd(yy, -2,'2012/04/10'))
は2010の値をint
として返します。これはdatepart(yy,doe)
と比較され、doe
列に格納されている日付値の整数年が戻されます。これらの2つのデータ型は両方ともint,
なので、compareはそれを行い、2010/01/01以降のレコードから情報を返します。ここで問題はありません。2010/04/10からデータを返す予定がない場合は、dateadd(yy, -2,'2012/04/10')
の値とdoe
の値を比較します。
and doe<= datepart(yy,'2012/04/10')
この場合、比較の問題があります。整数値2012とdoe
列の日付値を比較しようとしています。これらは同じデータ型ではないので、比較対象を見つける必要があります。
doe
列がdatetimeデータ型であることを前提としています(日付またはdatetime2の場合、エラーが発生します)。SQL Serverは数値データ型を使用しているため、整数をdatetimeと比較できますdatetimeデータ型2012年の値が日付1905年7月6日を(自分のために参照するCAST(2012 as datetime)
を使用)を表し、そのWHERE句は次のように何かに出翻訳:日付をすることはできませんので
WHERE datepart(year, doe) >= 2010
AND doe < '1905/07/06'
両方7月、1905年前と2010年1月以降は、データは返されません。
ここで実際に必要なことは、年を比較したいだけか、年/月/日を比較したいかによって異なります。長年の間、最後のdoe
をDATEPART(year, doe)
に置き換えて、機能的なクエリを用意することはできますが、速いクエリではありません。年/月/日を比較するには、前述のようにDATEADD
を使用し、最終比較で実際に入力した日付を使用します。
うまくいけば、それは役立ちます。
http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557を参照してください。受け入れられた答え –
それが実際のデータである場合は、すぐに削除する必要があります。 –
それは本当のものではありません。私はそれを削除しました。情報のための力学:) – Telgo