2016-01-04 8 views
2

Я получаю ежеквартальные записи с сервера sql. Записи выглядят как суммарные дебиты и кредиты в каждом квартале года. В моем sql-запросе я сделал четверти, и год динамичен, как вы можете видеть в коде.не удалось преобразовать дату из символьной строки

public List<QuarterlyExpenseList> GetExpenseDataQuarterly(string Id, string Year) 
     { 
      string SQL = "select aspnetusers.username, SUM(case when Expense.Type='credit' and (Expense.Date>='@year-01-01' and Expense.Date<='@year-03-31') then Expense.Amount else 0 end) as QuarterOneCredits,"; 
      SQL += " SUM(case when Expense.Type='credit' and (Expense.Date>='@year-04-01' and Expense.Date<='@year-06-30') then Expense.Amount else 0 end) as QuarterTwoCredits,"; 
      SQL += " SUM(case when Expense.Type='credit' and (Expense.Date>='@year-07-01' and Expense.Date<='@year-09-30') then Expense.Amount else 0 end) as QuarterThreeCredits,"; 
      SQL += " SUM(case when Expense.Type='credit' and (Expense.Date>='@year-10-01' and Expense.Date<='@year-12-31') then Expense.Amount else 0 end) as QuarterFourCredits,"; 
      SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>='@year-01-01' and Expense.Date<='@year-03-31') then Expense.Amount else 0 end) as QuarterOneDebits,"; 
      SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>='@year-04-01' and Expense.Date<='@year-06-30') then Expense.Amount else 0 end) as QuarterTwoDebits,"; 
      SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>='@year-07-01' and Expense.Date<='@year-09-30') then Expense.Amount else 0 end) as QuarterThreeDebits,"; 
      SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>='@year-10-01' and Expense.Date<='@year-12-31') then Expense.Amount else 0 end) as QuarterFourDebits"; 
      SQL += " from Expense inner join AspNetUsers on AspNetUsers.Id=Expense.MadeBy"; 
      if (Id == null) 
      { 
       SQL += " group by aspnetusers.username"; 
      } 
      else 
      { 
       SQL += " where [email protected] group by AspNetUsers.UserName group by aspnetusers.username"; 
      } 

      using (IDbConnection cn=Connection) 
      { 
       cn.Open(); 
       List<QuarterlyExpenseList> objList = cn.Query<QuarterlyExpenseList>(SQL, new { year = Year, id = Id }).ToList(); 
       return objList; 
      } 
     } 

здесь я получаю исключение из Conversion failed when converting date and/or time from character string. Может кто-нибудь сказать мне, что это значит и как я могу избавиться от него

+1

Почему вы не добавить переменные при создании запроса SQL? как 'SQL + =" SUM (случай, когда Expense.Type = 'credit' и (Expense.Date> = '"+ Year +" -04-01' и Expense.Date <= '"+ Year +" -06- 30 '), а затем Expense.Amount else 0 end) в качестве QuarterTwoCredits, ";' – Slasko

ответ

5

Я снял динамический год «@Year» за пределами строки символов, как это динамическое значение. Когда написано «@ year-04-01», SQL обрабатывал «@year» как строку символов, а не как динамическое значение.

Используйте следующий код:

public List<QuarterlyExpenseList> GetExpenseDataQuarterly(string Id, string Year) 
      { 
       string SQL = "select aspnetusers.username, SUM(case when Expense.Type='credit' and (Expense.Date>[email protected]+'-01-01' and Expense.Date<[email protected]+'-03-31') then Expense.Amount else 0 end) as QuarterOneCredits,"; 
       SQL += " SUM(case when Expense.Type='credit' and (Expense.Date>[email protected]+'-04-01' and Expense.Date<[email protected]+'-06-30') then Expense.Amount else 0 end) as QuarterTwoCredits,"; 
       SQL += " SUM(case when Expense.Type='credit' and (Expense.Date>[email protected]+'-07-01' and Expense.Date<[email protected]+'-09-30') then Expense.Amount else 0 end) as QuarterThreeCredits,"; 
       SQL += " SUM(case when Expense.Type='credit' and (Expense.Date>[email protected]+'-10-01' and Expense.Date<[email protected]+'-12-31') then Expense.Amount else 0 end) as QuarterFourCredits,"; 
       SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>[email protected]+'-01-01' and Expense.Date<[email protected]+'-03-31') then Expense.Amount else 0 end) as QuarterOneDebits,"; 
       SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>[email protected]+'-04-01' and Expense.Date<[email protected]+'-06-30') then Expense.Amount else 0 end) as QuarterTwoDebits,"; 
       SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>[email protected]+'-07-01' and Expense.Date<[email protected]+'-09-30') then Expense.Amount else 0 end) as QuarterThreeDebits,"; 
       SQL += " SUM(case when Expense.Type='debit' and (Expense.Date>[email protected]+'-10-01' and Expense.Date<[email protected]+'-12-31') then Expense.Amount else 0 end) as QuarterFourDebits"; 
       SQL += " from Expense inner join AspNetUsers on AspNetUsers.Id=Expense.MadeBy"; 
       if (Id == null) 
       { 
        SQL += " group by aspnetusers.username"; 
       } 
       else 
       { 
        SQL += " where [email protected] group by AspNetUsers.UserName group by aspnetusers.username"; 
       } 

       using (IDbConnection cn=Connection) 
       { 
        cn.Open(); 
        List<QuarterlyExpenseList> objList = cn.Query<QuarterlyExpenseList>(SQL, new { year = Year, id = Id }).ToList(); 
        return objList; 
       } 
      } 
+0

@CodeCaster Я удалил строку внешнего символа "@year" динамического года, так как это динамическое значение. Когда написано «@ year-04-01», SQL обрабатывал «@year» как строку символов, а не как динамическое значение. –

+0

@CodeCaster Done !! –

Смежные вопросы