2014-02-13 26 views
-1

我需要找到季度開始startQ1,startQ2等。運行一個需要6個查詢參數的查詢。我真的不知道這樣做的一種方式。所以,如果我可以使用日曆來發現今天是March1st(startq1),我不想用q1數組運行查詢......希望更清楚。如何設置參數查詢基於季度日期

  Calendar cal = Calendar.getInstance(); 

     java.sql.Date startQ1 = java.sql.Date.valueOf("2014-03-01"); 
     java.sql.Date startQ2 = java.sql.Date.valueOf("2014-06-01"); 
     java.sql.Date startQ3 = java.sql.Date.valueOf("2014-09-01"); 
     java.sql.Date startQ4 = java.sql.Date.valueOf("2014-12-01"); 

     java.sql.Date [][] q1 = new java.sql.Date[3][2]; 
     q1[0][0] = java.sql.Date.valueOf("2014-07-01"); 
     q1[0][1] = java.sql.Date.valueOf("2014-09-30"); 
     q1[1][0] = java.sql.Date.valueOf("2014-10-01"); 
     q1[1][1] = java.sql.Date.valueOf("2014-12-31"); 
     q1[2][0] = java.sql.Date.valueOf("2015-04-01"); 
     q1[2][1] = java.sql.Date.valueOf("2015-06-30"); 

     java.sql.Date [][] q2 = new java.sql.Date[3][2]; 
     q2[0][0] = java.sql.Date.valueOf("2014-10-01"); 
     q2[0][1] = java.sql.Date.valueOf("2014-12-31"); 
     q2[1][0] = java.sql.Date.valueOf("2015-01-01"); 
     q2[1][1] = java.sql.Date.valueOf("2015-03-31"); 
     q2[2][0] = java.sql.Date.valueOf("2015-07-01"); 
     q2[2][1] = java.sql.Date.valueOf("2015-09-30"); 

     java.sql.Date [][] q3 = new java.sql.Date[3][2]; 
     q3[0][0] = java.sql.Date.valueOf("2015-01-01"); 
     q3[0][1] = java.sql.Date.valueOf("2015-03-31"); 
     q3[1][0] = java.sql.Date.valueOf("2015-04-01"); 
     q3[1][1] = java.sql.Date.valueOf("2015-06-30"); 
     q3[2][0] = java.sql.Date.valueOf("2015-10-01"); 
     q3[2][1] = java.sql.Date.valueOf("2015-12-31"); 

     java.sql.Date [][] q4 = new java.sql.Date[3][2]; 
     q4[0][0] = java.sql.Date.valueOf("2015-04-01"); 
     q4[0][1] = java.sql.Date.valueOf("2015-06-30"); 
     q4[1][0] = java.sql.Date.valueOf("2015-07-01"); 
     q4[1][1] = java.sql.Date.valueOf("2015-09-30"); 
     q4[2][0] = java.sql.Date.valueOf("2016-01-01"); 
     q4[2][1] = java.sql.Date.valueOf("2016-03-31"); 

     if(cal.getTime() == startQ1) { // I know can't actually test this way. 
      for(int i = 0; i < 3; i++) { 
       for(int j = 0; j < 2; j++) { 
       ps.setDate(1, q1[i][j]); 
       ps.setDate(2, q1[i][j]); 
       ps.setDate(3, q1[i][j]); 
       ps.setDate(4, q1[i][j]); 
       ps.setDate(5, q1[i][j]); 
       ps.setDate(6, q1[i][j]); 
       } 
      } 
     } 

這裏的查詢:

  PreparedStatement ps=conn.prepareStatement("select distinct b.new_tagID," 
       + "Case WHEN convert(nvarchar(100),b.new_account) IS NULL THEN 'NO_DATA' ELSE convert(nvarchar(100)," 
       + "b.new_account) END AS AccountID," 
       + "Case WHEN c.Name IS NULL THEN 'NO_DATA' ELSE c.Name END as Name," 
       + "Case WHEN convert(nvarchar(100),a.OwnerId) IS NULL THEN 'NO_DATA' ELSE convert(nvarchar(100)," 
       + "a.OwnerId) END as OwnerId, b.new_EOL," 
       + "Case WHEN a.JobTitle IS NULL THEN 'NO_DATA' ELSE a.JobTitle END as JobTitle," 
       + "Case WHEN a.FirstName IS NULL THEN 'NO_DATA' ELSE a.FirstName END as FirstName," 
       + "Case WHEN a.LastName IS NULL THEN 'NO_DATA' ELSE a.LastName END as LastName," 
       + "Case WHEN a.EMailAddress1 IS NULL THEN 'NO_DATA' ELSE a.EMailAddress1 END as EMailAddress1," 
       + "a.new_Support_RenewalContact,d.YomiFullName,d.InternalEMailAddress," 
       + "(select InternalEMailAddress from dbo.SystemUserBase where SystemUserId = e.new_VPId) new_VPId," 
       + "(select InternalEMailAddress from dbo.SystemUserBase where SystemUserId = e.new_RVPId) new_RVPId," 
       + "b.new_RenewalOpptyIDyr2,b.new_RenewalOpptyIDyr3,b.new_RenewalOpptyIDyr4,b.new_RenewalOpptyIDyr5," 
       + "Case when b.new_LevelofSupport = 100000000 then 'Platinum' " 
       + "when b.new_LevelofSupport = 100000001 then 'Standard'" 
       + "when b.new_LevelofSupport = 100000002 then 'NONE'" 
       + "when b.new_LevelofSupport = 100000003 then 'Standard with AR'" 
       + "end as LevelOFSupport" 
       + " FROM" 
       + " dbo.new_assetExtensionBase as b left outer join dbo.contact as a on a.AccountID=b.new_account" 
       + " left outer join dbo.AccountBase as c on b.new_account=c.AccountId" 
       + " left outer join dbo.SystemUserBase as d on c.OwnerId=d.SystemUserId" 
       + " left outer join dbo.SystemUserExtensionBase as e on d.SystemUserId=e.SystemUserId " 
       + "WHERE " 
       + "(b.new_EOL >= ?) and " 
       + "(b.new_EOL <= ?) or " 
       + "(b.new_EOL >= ?) and " 
       + "(b.new_EOL <= ?) or " 
       + "(b.new_EOL >= ?) and " 
       + "(b.new_EOL <= ?) " 
       + " order by Case WHEN convert(nvarchar(100),b.new_account) IS NULL THEN 'NO_DATA' ELSE convert(nvarchar(100),b.new_account) END," 
       + " a.new_Support_RenewalContact desc,b.new_RenewalOpptyIDyr2 desc,b.new_RenewalOpptyIDyr3 desc,b.new_RenewalOpptyIDyr4 desc," 
       + "b.new_RenewalOpptyIDyr5 desc"); 
+0

我不知道你在做什麼。你可以嘗試解釋嗎?出於某種原因,您似乎只是將一堆日期放在數組中。 – Taylor

+1

我的天哪,這是什麼? – 2014-02-13 18:28:42

+0

也'cal.getTime()== startQ1'聞起來不好 – 2014-02-13 18:30:04

回答

0

你的問題是不可理解的。你應該編輯它。

我可以幫忙一個方面:如何獲得今年的季度

第一:不要使用java.util.Date &日曆類。他們是非常麻煩的。請使用Joda-Time或與Java 8捆綁的新java.time。*包。

如果您定義的季度是一年中的第一天,然後是每3個月,每個月的第一天開始,那麼您在示例代碼中工作太辛苦了。你知道,無論一年的,月數將始終是相同的:

  • 1 =一月
  • 4 =月
  • 7 =月
  • 10 =月

你可以在構建日期時間值時使用該月份的數字。或者,您可以爲一年中的第一天構建日期時間,然後重複添加3個月。

Joda-Time DateTime與java.util.Date一樣,代表日期和時間。所以你需要把時間設定到你宿舍的一天的第一時刻。如有疑問,請致電DateTime實例的withTimeAtStartOfDay方法。

您應該指定一個時區作爲一天的開始取決於特定的時區。如果您未能指定時區,則使用JVM的默認時區。

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal"); 
DateTime q1_2014 = new DateTime(2014, 1, 1, 0, 0, 0, timeZone); 
DateTime q2_2014 = q1_2014.plusMonths(3); 
DateTime q3_2014 = q1_2014.plusMonths(6); 
DateTime q4_2014 = q1_2014.plusMonths(9);