从 C# 中的字符串 SQL 转换日期和/或时间时转换失败

Posted

技术标签:

【中文标题】从 C# 中的字符串 SQL 转换日期和/或时间时转换失败【英文标题】:Conversion failed when converting date and/or time from character string SQL in c# 【发布时间】:2016-06-16 05:41:16 【问题描述】:

当我比较日期时出现此错误。

sql查询命令: Select * from processTBL WHERE is=2016144 and date between '10/06/2016' and '15/06/2016' 该命令有效,但是当将数据填充到 DateTabe 时出现转换错误。

这是我的 c# 方法;

public DataGridView hesapOzeti(string command)
    
        DataGridView gdview = new DataGridView();

        if (connection.State == ConnectionState.Closed)
            connection.Open();
        SqlCommand komut = new SqlCommand(command, connection);
        SqlDataAdapter da = new SqlDataAdapter(komut);
        DataTable dt = new DataTable();
        da.Fill(dt);
        connection.Close();
        gdview.DataSource = dt;
        return gdview;
    

错误:

【问题讨论】:

***.com/questions/21253566/… 【参考方案1】:

快速解决方法是以明确的格式发送日期,以便正确解释您的格式:

Select * from processTBL WHERE is=2016144 and date between '20160601' and '20160616'

错误来自于 15 被认为是一个月,因此日期无法解析。

正确的做法是使用参数化查询:

command.Parameters.AddWithValue("@is", 2016144);
command.Parameters.AddWithValue("@FromDate", new DateTime(2016, 06, 10));    
command.Parameters.AddWithValue("@ToDate", new DateTime(2016, 06, 15));  

您的查询变为:

Select * from processTBL WHERE is = @is and date between @FromDate and @ToDate

一般来说,您应该始终尝试使用参数化查询来避免此类错误并防止 SQL 注入。

【讨论】:

一路参数化is。另外,请阅读Can we stop using AddWithValue() already? 谢谢兄弟这是工作我改变这个command.Parameters.AddWithValue("@FromDate", DateTime.Parse(fromDate))【参考方案2】:

文字的日期格式取决于语言环境(特别是DATEFORMAT)。日期时间的 BOL 页面列出了区域设置和非区域设置特定格式

https://msdn.microsoft.com/en-AU/library/ms187819.aspx

理想情况下,您应该使用 ISO 8601 格式 - YYYY-MM-DDThh:mm:ss[.mmm]YYYYMMDD[ hh:mm:ss[.mmm]]

在您的代码中,尝试date between '20160610' and '20160615'

【讨论】:

以上是关于从 C# 中的字符串 SQL 转换日期和/或时间时转换失败的主要内容,如果未能解决你的问题,请参考以下文章

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

在 C# 中将十六进制值从 SQL Server 转换为日期时间

转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV

请问:从字符串转换日期和/或时间时,转换失败。怎么修改

C# 将 DateTime 从 UTC 转换为 GMT 或 BST

Sql中的日期转换错误