2017-10-30 13 views
0

私はtomcat、jsp、およびMSSQL 2008を使用しており、毎日、毎週、毎月、毎年などの要約データを取得したいと考えています。 ここから、MSSQLのこれらのサマリーデータに対してdatapart()関数を使用する方法を検索しました。 JSPで は、私は同じクエリ内のJSP executeQuery()とMSMSの結果

PreparedStatement pr = conn.prepareStatement(query); 
ResultSet rs=pr.executeQuery(); 

及びMSMSでの使用、試験用DIRECTRYを照会しました。

私のJSPプログラムから2つの問題がありましたが、同じクエリを使用してMS SQL Server Management Studioでうまくいきました。

This is a screenshot of query result in MSMS

私の問題は次のとおりである: "年次" の

  • 問合せは、JSPを使用していません。
  • 「月間」のクエリでは、月の値(1,2,3、...)は正しく返されませんが、0(ゼロ)のみです。

"Daily"と "Weekly"はうまくいきます。どうすればこれらの問題を解決できますか? ありがとうございます。

私のクエリは次のとおりです。

switch (unit) 
{ 
    case "Daily"  : 
     query = "SELECT cast(datepart(dy, ProcessDate) as varchar(3)) Day, " + 
        "cast(year(ProcessDate) as varchar(4)) Year, " + 
        "SUM(case WHEN Warranty = 'Y' then 1 else 0 end) InWarranty, " + 
        "SUM(case WHEN Warranty = 'N' then 1 else 0 end) OutOfWarranty, " + 
        "SUM(case WHEN Warranty = 'X' then 1 else 0 end) NAWarranty " + 
        "FROM zz_RMA_Summary " + 
        "WHERE ProcessDate BETWEEN '" + sDate + "' AND '" + eDate + "' " + 
        "group by year(ProcessDate), datepart(dy, ProcessDate) " + 
        "order by year(ProcessDate) DESC, datepart(dy, ProcessDate) DESC "; 
     break; 

    case "Weekly"  : 
     query = "SELECT cast(datepart(wk, ProcessDate) as varchar(2)) Week, " + 
        "cast(year(ProcessDate) as varchar(4)) Year, " + 
        "SUM(case WHEN Warranty = 'Y' then 1 else 0 end) InWarranty, " + 
        "SUM(case WHEN Warranty = 'N' then 1 else 0 end) OutOfWarranty, " + 
        "SUM(case WHEN Warranty = 'X' then 1 else 0 end) NAWarranty " + 
        "FROM zz_RMA_Summary " + 
        "WHERE ProcessDate BETWEEN '" + sDate + "' AND '" + eDate + "' " + 
        "group by year(ProcessDate), datepart(wk, ProcessDate) " + 
        "order by year(ProcessDate) DESC, datepart(wk, ProcessDate) DESC "; 
     break; 

    case "Monthly"  : 
     query = "SELECT cast(datepart(mm, ProcessDate) as varchar(2)) Month, " + 
        "cast(year(ProcessDate) as varchar(4)) Year, " + 
        "SUM(case WHEN Warranty = 'Y' then 1 else 0 end) InWarranty, " + 
        "SUM(case WHEN Warranty = 'N' then 1 else 0 end) OutOfWarranty, " + 
        "SUM(case WHEN Warranty = 'X' then 1 else 0 end) NAWarranty " + 
        "FROM zz_RMA_Summary " + 
        "WHERE ProcessDate BETWEEN '" + sDate + "' AND '" + eDate + "' " + 
        "group by year(ProcessDate), datepart(mm, ProcessDate) " + 
        "order by year(ProcessDate) DESC, datepart(mm, ProcessDate) DESC "; 
     break; 

    case "Yearly"  : 
     query = "SELECT cast(yyyyy, ProcessDate) as varchar(4)) Year, " + 
        "SUM(case WHEN Warranty = 'Y' then 1 else 0 end) InWarranty, " + 
        "SUM(case WHEN Warranty = 'N' then 1 else 0 end) OutOfWarranty, " + 
        "SUM(case WHEN Warranty = 'X' then 1 else 0 end) NAWarranty " + 
        "FROM zz_RMA_Summary " + 
        "WHERE ProcessDate BETWEEN '" + sDate + "' AND '" + eDate + "' " + 
        "group by datepart(yyyy, ProcessDate) " + 
        "order by datepart(yyyy, ProcessDate) DESC "; 
     break; 
} 

答えて

0

あなたの問題は、あなたがstringsとして渡すことdatesによって引き起こされる、それは間違っています。

なぜ動的SQLを使用しますか、必須ですか?

dateタイプ)で使用できますが、string連結では使用できませんか?

あなたは文字列の連結を主張する場合は、一貫性のある結果にあなたをもたらすこと、あるいは、あなたの日付文字列を渡す任意の区切り文字なしyyyymmdd形式であなたの日付を渡すために適切なスタイルでconvert() 機能を使用する必要があります。今、何が起こる

であるか、またはあなたはSSMSで使用よりも、別の形式でアプリケーション用品date秒、またはアプリケーションが異なるだけdefault languageを持つ別のloginを使用しています。

ログインのデフォルト言語はセッションによって継承され、日付定数の解釈方法に影響します。ここで

は一例です:

declare @t table (dt datetime); 
insert into @t values ('20170110'), ('20171001'); -- Jan, 10; Oct, 1st 

set language british -- this happens when my login's default language is us_english 
select * 
from @t 
where dt between '01/09/2017' and '01/01/2018' -- I'm in Europe an I want the dates starting from Sept, 1st 
--- 
dt 
2017-10-01 00:00:00.000 -- I'm happy with correct result 



set language us_english -- this happens when my login's default language is us_english 
select * 
from @t 
where dt between '01/09/2017' and '01/01/2018' -- I'm in Europe an I want the dates starting from Sept, 1st 
---- 
dt 
2017-01-10 00:00:00.000 -- quite strange since I filtered starting from September 
2017-10-01 00:00:00.000 

しかし、あなたはyyyymmddあるbetween '20170901' and '20180101'を使用した場合の代わりに、between '01/09/2017' and '01/01/2018'このすべては発生しません。

+0

ありがとう、sepupic。あなたのアドバイスは決定的なものではありませんでしたが、私は答えを得ることができました。 「Monthly」と「Yearly」の部分には、JSPに間違ったコードがいくつかあります。 – Soo

関連する問題