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”,它就会运行