无法将 DateTime 从 SQL Server 转换为 C# DateTime

Posted

技术标签:

【中文标题】无法将 DateTime 从 SQL Server 转换为 C# DateTime【英文标题】:Unable to convert DateTime from SQL Server to C# DateTime 【发布时间】:2017-02-07 21:26:46 【问题描述】:

我用 C# 编写了一个使用日期的程序。它从 SQL Server 表中获取值。我使用的是 Windows 7,程序运行良好。我有这行代码:

DateTime fechaOperacion = Convert.ToDateTime(reader["FechaOperacion"]);

阅读器返回 24 小时格式的日期,我能够将其转换为 DateTime 变量。

现在我将系统升级到 Windows 10,同一行代码抛出以下错误:

字符串未被识别为有效的日期时间。从索引 20 开始有一个未知单词。

现在读者返回 a.m. / p.m.格式,并且在索引 20 处有 a.m 或 p.m.

我尝试了以下方法:

将代码行改写为:

    Convert.ToDateTime(reader["FechaOperacion"], System.Globalization.CultureInfo.InvariantCulture) reader.GetDateTime(reader.GetOrdinal("FechaOperacion"));

将区域性转换为 24 小时格式

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(1033);

但似乎这些都不起作用,我不知道还能做什么。

【问题讨论】:

定义“它似乎不起作用”。特别是reader.GetDateTime(reader.GetOrdinal("FechaOperacion")) 的结果是什么,这是独立于任何格式读取DATETIME 列的正确方法? reader["FechaOperacion"] 返回的究竟是什么?它提到String 的事实意味着它不是“sql DateTime” - SQL datetime 值很好,不需要解析。那么:它是什么? 如果 FechaOperacion 是 DATETIME 列,那么听起来像是显示问题。如果您执行var dateStr = fechaOperacion.ToString("dd/MM/yyyy HH:mm:ss"); 会发生什么? dateStr 的值是多少? 您不必将 SQL datetime 转换为 C# DateTime。它们是等价的。如果您认为需要转换任何内容,那是因为您使用的是字符串而不是 datetime。而不是使用Convert,您应该能够使用直接转换,即(DateTime)。如果不能,则返回字符串 从我在您的问题中读到的内容,我了解到您将日期存储在数据库中的 nvarchar/varchar 中,这不是一个好主意。如果您使用的是日期时间,则无需转换。 【参考方案1】:

最终,这里的根本问题是将表示日期/时间的值存储为文本数据(意思是某种[n][var]char(max|n),或在推送时:[n]text)。这有多个问题:

需要更多空间 无法正确/有效地排序 无法正确/有效地对其进行索引 无法正确/有效地过滤 这会导致客户端和服务器之间的解析错误 它存在各种本地化和国际化问题

你应该有一个datetime / date / time / 等列。然后将其存储为一个数字(不是字符串),它需要零解析并且可以可靠地工作而不会出现任何转换问题。


注意:它可能是您正确存储它但在查询的select 语句中对其进行格式化。在这种情况下,只需不要这样做;返回日期时间原始数据,让接收客户端担心如何显示它。

【讨论】:

【参考方案2】:

根据您的实际格式,您可以定义一个合适的格式列表并进行如下转换

string[] mfs =  "MM/dd/yyyy HH:mm:ss",  "MM/dd/yyyy h:mm:ss tt";

var dat = DateTime.ParseExact("04/23/1945 8:45:22 PM", mfs, 
                System.Globalization.CultureInfo.InvariantCulture, 
                System.Globalization.DateTimeStyles.None);

【讨论】:

以上是关于无法将 DateTime 从 SQL Server 转换为 C# DateTime的主要内容,如果未能解决你的问题,请参考以下文章

DateTime 列上的 Mono InvalidOperationException (SQL Server)

SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime

将 SQL Server 中 datetime 字段的默认值添加到时间戳

如何在SQL Server中将datetime值转换为yyyymmddhhmmss?

SQL Server 无法减去日期

oracle时间戳6转换为sql server datetime2错误