繁体   English   中英

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

[英]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;

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM