【发布时间】:2016-06-12 20:32:45
【问题描述】:
我有一个包含两个 DateTime 列的数据表:date_from 和 date_to。
string dateFrom = row["date_from"].ToString();
string dateTo = row["date_to"].ToString();
当此代码在客户环境中运行时,它会返回以下格式的日期:
"2016-01-01 00.00.00"
"2016-02-01 00.00.00"
这个字符串然后被插入到 SQL 中:
SELECT * FROM my_table
WHERE UPPER(status) = 'N'
AND trans_date >= {ts '1900-01-01 00.00.00' }
AND trans_date <= {ts '1900-01-01 00.00.00' }
执行此 SQL 时,它返回错误“从字符串转换日期和/或时间时转换失败。”
因此,快速解决此问题的方法是运行 string.Replace(),在其中将句点替换为冒号:
dateFrom = dateFrom.Replace(".", ":");
但是,我的问题是为什么返回的日期带有句点作为时间戳分隔符而不是冒号?
我在本地机器上创建了这个测试,但不幸的是,对于这种情况,它返回了 DateTime 字符串的正确表示:
DataTable table = new DataTable();
table.Columns.Add("date", typeof(DateTime));
DataRow row = table.NewRow();
row["date"] = DateTime.Now;
table.Rows.Add(row);
DateTime date = DateTime.Parse(table.Rows[0]["date"].ToString());
到目前为止,我的猜测是这与客户文化有关,但我非常感谢有这方面经验的人提供意见,以便我可以向客户提供反馈,说明为什么会首先发生这种情况。
这可能只是一个巧合,但值得一提的是,这只发生在使用 Windows 10 的用户身上。使用 Windows 7 的每个人都不会收到此错误。
【问题讨论】:
-
你为什么在SQL中使用字符串连接,为什么不使用参数?如果你这样做,那么文化设置为什么都没有关系。
-
您可以使用自定义日期字符串来避免本地文化问题:msdn.microsoft.com/en-us/library/… 例如 date.ToString("yyyy-MM-dd H:mm:ss")
-
感谢您提供有关参数化和使用自定义 ToString() 的意见。我会执行的。
标签: c# sql sql-server datetime datatable