2017-03-22 8 views
0

私はテーブルのアカウントマスターがあります。 日付を指定すると、指定した日付の最後の3年間に登録された顧客数が返されます。ここSQLサーバー:過去3年間を検索お客様の詳細

は、いずれかを返していない私のクエリは、values.plz変更.TIA

select count(ACID) as numberofcustomers from ACCOUNTMASTER 
where 
datepart(yy,doe)>= datepart(yy,dateadd(yy,-2,'2012/04/10')) 
and 
doe<= datepart(yy,'2012/04/10') 
+1

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557を参照してください。受け入れられた答え –

+0

それが実際のデータである場合は、すぐに削除する必要があります。 –

+0

それは本当のものではありません。私はそれを削除しました。情報のための力学:) – Telgo

答えて

0

で私を助けているあなたの問題が明らかに何をするか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月以降は、データは返されません。

ここで実際に必要なことは、年を比較したいだけか、年/月/日を比較したいかによって異なります。長年の間、最後のdoeDATEPART(year, doe)に置き換えて、機能的なクエリを用意することはできますが、速いクエリではありません。年/月/日を比較するには、前述のようにDATEADDを使用し、最終比較で実際に入力した日付を使用します。

うまくいけば、それは役立ちます。

+0

訂正のためのThx。私はANDの後にDatepartを見逃しました。その働きnow.Thq :) – Telgo

関連する問題