[英]Conversion failed when converting date and/or time from character string
我正在尝试查询日期在今天和昨天之间的数据库,但是在从字符串转换日期和/或时间时遇到错误,提示转换失败。
我的查询下面是今天和昨天的参数
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;
首先,您要计算today
和yesterday
错误。 这是正确的方法:
var today = DateTime.Today;
var yesterday = today.AddDays(-1);
并重新查询:删除命名参数周围的...BETWEEN @yesterday and @today...
( '
),这样您的查询将读取...BETWEEN @yesterday and @today...
,一切...BETWEEN @yesterday and @today...
。
您必须从查询的参数中删除简单的cote '
:
..BETWEEN @yesterday AND @today
您无需使用特定格式创建今天和昨天的内容,只需获取类似以下内容的变量:
var today = DateTime.Today;
var yesterday = DateTime.Today.AddDays(-1);
并在SqlDbType.DateTime
使用Parameter,然后将DateTime直接传递给该参数(无需转换)。
cmd.Parameters.Add("@yesterday", SqlDbType.DateTime).Value = yesterday
cmd.Parameters.Add("@today", SqlDbType.DateTime).Value = today
问题是您引用的命令参数被视为字符串文字,而不是如下所示的参数。
WHERE Date BETWEEN '@yesterday' AND '@today'
您应该将其更改为
WHERE [Date] BETWEEN @yesterday AND @today
特别是在其他答案中有很多优点。 @Abdellah在教导datetime
数据类型和适当的值方面做得很好,但是您的SQL查询本身需要工作,这可能就是为什么您没有得到想要的东西。 因为就像@yesterday
和@today
一样,您需要从@message
删除``(ticks)”。 然后,您可以在不需要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
,但是您是在ErrorDay
计数错误,而不是几天,要更改计数,只需将DATEPART()
更改为您想要的时间部分,例如分钟等等。
下一步您是否真的需要投射消息字段?
在日期上。 您想要今天和昨天还是真的想要昨天的一切? 如果是昨天,则将此行交换到另一个日期行的查询中:
-如果您真的只想昨天午夜至晚上11:59:59,则应为CAST([Date] AS DATE)= CAST(GETDATE()-1 AS DATE)
接下来,如果您确实真的想将昨天和今天作为参数传递,并且想要昨天和今天的所有内容执行以下操作,并按照其他文章的建议更新代码中的参数定义。
-从昨天的午夜到今天的午夜使用此行,在CAST(@yesterday AS DATE)和CAST(@Today AS DATE)之间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.