我正在尝试查询日期介于今天和昨天之间的数据库,但是在从字符串转换日期和/或时间时收到错误说转换失败。
我的查询在今天和昨天的参数下面
string today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).ToString("yyyy-MM-dd");
string yesterday= new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day-1).ToString("yyyy-MM-dd");
string errorsPerHourQuery = "WITH data_CTE(ErrorDay)" +
"AS(" +
"SELECT DATEPART(hh, Date) AS ErrorDay FROM cloud.ErrorLog " +
"WHERE Date BETWEEN '@yesterday' AND '@today' " +
"AND CAST(Message AS varchar(200)) ='@message'"+
")" +
"SELECT ErrorDay, COUNT(*) AS count FROM data_CTE GROUP BY ErrorDay ORDER BY ErrorDay";
conn.Open();
cmd.Parameters.AddWithValue("@message", message);
cmd.Parameters.AddWithValue("@yesterday", yesterday);
cmd.Parameters.AddWithValue("@today", today);
cmd.CommandType = CommandType.Text;
答案 0 :(得分:2)
首先,您正在计算today
和yesterday
错误。这是正确的方法:
var today = DateTime.Today;
var yesterday = today.AddDays(-1);
重新启动查询:从命名参数周围删除刻度线('
),以便查询显示...BETWEEN @yesterday and @today...
,并且您将全部设置完毕。
答案 1 :(得分:2)
您必须从查询中的参数中删除简单的cote '
:
..BETWEEN @yesterday AND @today
您不需要使用特定格式创建今天和昨天,您可以简单地获得如下变量:
var today = DateTime.Today;
var yesterday = DateTime.Today.AddDays(-1);
并使用带SqlDbType.DateTime
的参数,然后将DateTime直接传递给参数(不需要转换)。
cmd.Parameters.Add("@yesterday", SqlDbType.DateTime).Value = yesterday
cmd.Parameters.Add("@today", SqlDbType.DateTime).Value = today
答案 2 :(得分:0)
问题是你引用的命令参数被认为是字符串文字而不是参数,如下所示。
WHERE Date BETWEEN '@yesterday' AND '@today'
您应该将其更改为
WHERE [Date] BETWEEN @yesterday AND @today
答案 3 :(得分:0)
其他答案中有很多好处,尤其如此。 @Abdellah在教授datetime
数据类型和适当的值方面做得很好,但是你的SQL查询本身需要工作,这可能就是你没有得到你想要的东西的原因。因为就像@yesterday
和@today
一样,您需要从@message
中删除''(刻度)。然后你可以在一步中完成你的查询,你不需要cte。此外,如果您不打算通过除昨天或今天以外的任何日期,则不需要使用SQL的内置函数参数。
因此,删除所有参数周围的所有刻度(@yest ...)
这是一个适合您的SQL查询:
SELECT
ErrorHour = DATEPART(HH,[Date])
,[Count] = COUNT(*)
FROM
cloud.ErrorLog
WHERE
--use this line from midnight yesterday to midnight today
CAST([Date] AS DATE) BETWEEN CAST(GETDATE() - 1) AND CAST(GETDATE())
--what is the datatype for message does it really need to be cast?
AND CAST([Message] AS VARCHAR(200)) = @Message
GROUP BY
DATEPART(HH,[Date])
ORDER BY
ErrorHour
注意我提出ErrorHour
我们欢迎您更改为ErrorDay
,但是您计算的是每小时的错误而不是几天,更改您的计数只需将您的DATEPART()
更改为你想要的时间成分,例如分钟等。
下一步你真的需要投射消息字段吗?
在日期上。你想要今天和昨天或者只是昨天的一切吗?如果就在昨天将此行换成另一个日期行的查询:
- 如果你真的只是希望在昨天午夜到晚上11:59:59那应该是 CAST([Date] AS DATE)= CAST(GETDATE() - 1 AS DATE)
接下来,如果您真的希望昨天和今天作为参数传递,并且您希望昨天和今天全部都执行以下操作,并在代码中更新您的参数定义,如其他帖子所示。
- 从昨天午夜到今天午夜使用此行 CAST([Date] AS DATE)之间的过程(@yesterday AS DATE)和CAST(@Today as DATE)