You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# DateTime解析提取时间失败及SQL查询格式报错问题求助

C# DateTime解析与SQL查询格式问题解决方案

核心问题定位

  1. 你调用dt.ToString("hh:mm:ss tt");后没有接收返回值:DateTime是值类型,ToString()方法不会修改原变量本身,你后续拼接SQL用到的dt还是完整的DateTime结构,默认调用无参ToString()时会输出系统当前区域文化对应的完整日期时间格式。
  2. 直接拼接SQL字符串属于高危操作,除了存在SQL注入风险外,日期格式完全依赖程序运行时的区域文化设置,格式不稳定就是你前14次循环正常、后续报错的核心原因:大概率前14次的日期中日部分≤12,不同区域的月/日顺序解析没有冲突,到第15次日部分超过12后,数据库无法识别错位的月/日格式,直接抛出异常。

修复建议

最优方案:使用参数化查询(彻底解决格式问题)

完全不需要手动处理日期格式,由ADO.NET自动完成类型匹配,同时规避SQL注入风险,示例代码如下:

// 按需调整参数类型适配你的数据库字段:
// 如果数据库StartTime是time类型,传dt.TimeOfDay
// 如果StartTime是datetime类型仅需匹配时间部分,可调整SQL语句对字段做时间转换
string querySql = "SELECT * FROM [***].[***].[****] WHERE Id = @Id AND StartTime = @StartTime";
using (SqlCommand command = new SqlCommand(querySql, yourDbConnection))
{
    command.Parameters.AddWithValue("@Id", Id);
    // 若StartTime为time类型:
    command.Parameters.AddWithValue("@StartTime", dt.TimeOfDay);
    // 若StartTime为datetime类型仅需匹配时间:
    // command.Parameters.AddWithValue("@StartTime", dt.ToString("HH:mm:ss"));
    // 或调整SQL为 WHERE Id = @Id AND CAST(StartTime AS time) = @TimeParam
    // 执行查询逻辑
}

临时方案:手动控制时间字符串输出(仅推荐调试用,不建议生产环境拼接SQL)

如果确实需要生成时间字符串,必须接收ToString()的返回值,同时指定固定格式:

// HH为24小时制,hh为12小时制,按需选择
string timePart = dt.ToString("HH:mm:ss");
// 拼接SQL时强制用不变文化避免格式漂移
string querySql = $"SELECT * FROM [***].[***].[****] WHERE Id = {Id} AND StartTime = '{dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}'";

内容的提问来源于stack exchange,提问作者jlfish1997

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:54:00