C# 从字符串转换日期和/或时间时转换失败
我试图查询日期介于今天和昨天之间的数据库,但在从字符串转换日期和/或时间时出现错误,表示转换失败 下面是我的查询以及我今天和昨天的参数C# 从字符串转换日期和/或时间时转换失败,c#,sql,sql-server,datetime,C#,Sql,Sql Server,Datetime,我试图查询日期介于今天和昨天之间的数据库,但在从字符串转换日期和/或时间时出现错误,表示转换失败 下面是我的查询以及我今天和昨天的参数 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.Mo
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;
首先,你计算你的
今天
和昨天
是错误的。以下是正确的方法:
var today = DateTime.Today;
var yesterday = today.AddDays(-1);
和regaring query:从命名参数周围删除勾号(
”
),这样您的查询将在@beday和@today之间读取。
,您就可以全部设置好了 首先,你计算今天的和昨天的是错误的。以下是正确的方法:
var today = DateTime.Today;
var yesterday = today.AddDays(-1);
和regaring query:从命名参数周围删除勾号(”
),这样您的查询将在@beday和@today之间读取。
,您就可以全部设置好了 问题在于,您引用的命令参数被视为字符串文字,而不是如下所示的参数
WHERE Date BETWEEN '@yesterday' AND '@today'
你应该把它改成
WHERE [Date] BETWEEN @yesterday AND @today
问题是您引用的命令参数被认为是字符串文字,而不是如下所示的参数
WHERE Date BETWEEN '@yesterday' AND '@today'
你应该把它改成
WHERE [Date] BETWEEN @yesterday AND @today
您必须从查询中的参数中删除简单cote”
:
..BETWEEN @yesterday AND @today
您无需使用特定格式创建“今天”和“昨天”,只需获得如下变量:
var today = DateTime.Today;
var yesterday = DateTime.Today.AddDays(-1);
并将参数与SqlDbType.DateTime一起使用,然后将DateTime直接传递给参数(不需要转换)
您必须从查询中的参数中删除简单cote”
:
..BETWEEN @yesterday AND @today
您无需使用特定格式创建“今天”和“昨天”,只需获得如下变量:
var today = DateTime.Today;
var yesterday = DateTime.Today.AddDays(-1);
并将参数与SqlDbType.DateTime一起使用,然后将DateTime直接传递给参数(不需要转换)
特别是在其他答案中有很多好的地方@Abdellah在教授datetime
数据类型和适当的值方面做得很好,但是SQL查询本身需要工作,这可能是您无法获得所需内容的原因。因为就像昨天的@和今天的
一样,您需要从@消息中删除“”(勾号)。然后,您可以在一个步骤中完成查询—您不需要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,那应该是
强制转换([Date]作为日期)=强制转换(GETDATE()-1作为日期)
接下来,如果您真的希望将昨天和今天作为参数传递,并且希望昨天和今天都作为参数传递,请按照其他帖子的建议执行以下操作并更新代码中的参数定义
--从昨天午夜到今天午夜使用这条线
演员([日期]作为日期)在演员(@昨天作为日期)和演员(@今天作为日期)其他答案中有很多优点@Abdellah在教授datetime
数据类型和适当的值方面做得很好,但是SQL查询本身需要工作,这可能是您无法获得所需内容的原因。因为就像昨天的@和今天的
一样,您需要从@消息中删除“”(勾号)。然后,您可以在一个步骤中完成查询—您不需要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,那应该是
强制转换([Date]作为日期)=强制转换(GETDATE()-1作为日期)
接下来,如果您真的希望将昨天和今天作为参数传递,并且希望昨天和今天都作为参数传递,请按照其他帖子的建议执行以下操作并更新代码中的参数定义
--从昨天午夜到今天午夜使用这条线
在强制转换(@昨天为日期)和强制转换(@今天为日期)之间强制转换([日期]为日期)删除勾号(”
)从您的命名参数开始,这样您的查询将读取@Dayed和@today之间的…
,然后您就可以全部设置好了。按照这种编写方式,您尝试将字符串文本转换为日期,但总是会失败。由于您使用的是传递sql,而不是过程,因此您确实需要阅读本文。AddWithValue有时会获取错误的数据类型。使用此类传递查询时,需要显式定义数据类型。为什么要将日期转换为字符串?只需将它们作为日期,并删除“from@beday”和“today”,它就会运行