从字符串转换日期和/或时间时转换失败

时间:2016-06-15 18:46:37

标签: 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.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;

4 个答案:

答案 0 :(得分:2)

首先,您正在计算todayyesterday错误。这是正确的方法:

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)