我在C#中调用了一个存储过程,结果是:
0.033333
0.550000
0.133333
24.133333
在我的c#代码中,我需要检查哪一个高于24.如何才能对查询结果进行双重转换呢?
这是我的代码:
sqlConnection con2 = conec.ObtenerCon();
SqlCommand com2 = new SqlCommand("ind_meta", con2);
com2.CommandType = System.Data.CommandType.StoredProcedure;
com2.Parameters.Add("@finicial", SqlDbType.DateTime);
com2.Parameters["@finicial"].Value = Convert.ToDateTime(fini + " " + hini);
com2.Parameters.Add("@ffinal", SqlDbType.DateTime);
com2.Parameters["@ffinal"].Value = Convert.ToDateTime(ffin + " " + hfin);
DataTable ds1 = new DataTable();
using (SqlDataAdapter a1 = new SqlDataAdapter(com2))
{
a1.Fill(ds1);
}
foreach (DataRow dsRow1 in ds1.Rows)
{
if (double.Parse(dsRow1[0].ToString(), NumberStyles.Currency) < 24)
a++;
if (double.Parse(dsRow1[0].ToString(), NumberStyles.Currency) > 24 &&
double.Parse(dsRow1.ToString(), NumberStyles.Currency) < 48)
b++;
if (double.Parse(dsRow1[0].ToString(), NumberStyles.Currency) > 48)
c++;
}
答案 0 :(得分:1)
我假设您没有将double值转换为数据库中的字符串,因此您无需将其转换为C#中的字符串。你只需要相应地投射它。
double value = dsRow1.Field<double>(0);
完整的循环:
foreach (DataRow dsRow1 in ds1.Rows)
{
double value = dsRow1.Field<double>(0);
if (value < 24)
a++;
else if (value >= 24 && value < 48)
b++;
else
c++;
}
编辑:“它不起作用,错误是关于转换,查询是:datediff(date1,date2)/ 60 ”
DATEDIFF
有三个参数,因此您的代码甚至会导致语法错误。但我假设您使用datepart
参数,例如小时:
DATEDIFF(hh, date1,date2)/60
这是整数除法,因为DATEDIFF
返回有符号整数。整数除法总是产生整数,小数部分被截断。您需要将一侧转换为浮点数:
SELECT DATEDIFF(mi, GetDate(),DATEADD(dd,1,GetDate())) / CAST(60 AS DECIMAL(9,2))
现在您可以将其投射到decimal
:
foreach (DataRow dsRow1 in ds1.Rows)
{
decimal value = dsRow1.Field<decimal>(0);
if (value < 24)
a++;
else if (value >= 24 && value < 48)
b++;
else
c++;
}
但是,为什么你需要分为60?听起来好像你想要从几分钟开始。然后你可以在第一时间使用正确的datepart
:
DATEDIFF(hh, GetDate(),DATEADD(dd,1,GetDate()))