【问题标题】:SqlDataAdapter Truncates DateTime to 2 Digit YearSqlDataAdapter 将 DateTime 截断为 2 位数年份
【发布时间】:2024-05-22 20:30:02
【问题描述】:

我有一个 SQL 表,我正试图将它读入我的应用程序,其中包含一个日期时间列。当我在应用程序中使用 SqlDataAdapter 填充 DataTable 时,它​​会将年份截断为 2 位数年份(因此 1/1/1999 或 1/1/2099 都显示 1/1/99)。

Dim dt As DataTable
Using connection As New SqlConnection("...")
    Dim query As String = "SELECT * FROM [foo]"
    Dim adapter As New SqlDataAdapter(query, connection)

    connection.Open()
    adapter.Fill(dt)
End Using

直接在 SQL 中执行相同的 SELECT 语句会返回一个带有 4 位数年份的日期时间,因此这似乎是 VB 问题而不是 SQL 问题。

我怎样才能确保它读取全年并避免类似 Y2K 的错误?

【问题讨论】:

  • 日期没有格式。这是您用来查看日期的应用程序如何决定如何在视频/打印机上以字符串格式显示日期。您使用哪个应用程序查看数据字段?
  • 在我的应用程序中,我正在使用自定义日期格式 dd/MM/yyyy 填充 DateTimePicker,如果日期设置为 2099 年 1 月 1 日,则 DateTimePicker 将日期显示为 1/ 1/1999。我已经将其追溯到最初的数据拉取,因为当我在调试器中查看填充后的 DataTable 时,它​​显示日期为 1/1/99 并且我的 Windows 区域设置设置为猜测 1930 年和2029.
  • 听起来你在某处应用了转换的代码。你可以edit你的帖子来展示INSERT过程;您还可以在发布的代码中添加一两行,以便在读取数据表后立即打印数据表中的日期。
  • 我相信我已经部分弄清楚了。我的 Windows 设置设置为 mm/dd/yy。我的应用程序中的遗留代码将数据从 SQL 拉到 DataTable 中。然后它将日期转换为字符串而不指定格式,因此它使用我的本地设置(mm/dd/yy),将年份截断为 2 位。最后,它获取该字符串并将其设置为 DateTimePicker 的值(然后将 2 位数年份转换回 4 位数年份)
  • converting the date to a string你的问题

标签: sql-server vb.net datetime datatable sqldataadapter


【解决方案1】:

找到答案了。

我的 Windows 区域设置设置为 2 位数年份。 DataTable 正确地保存了完整日期,但在设置 DateTimePicker 的值之前,DataTable 中保存的日期被转换为未指定特定日期格式的字符串。

由于未指定格式,它使用了我的本地设置并截断了年份的前两位数。

不言而喻,但在将日期转换为字符串时要小心,并在有意义时指定特定格式。理想情况下,首先不要将日期转换为字符串(在我的情况下,它是执行此操作的遗留代码)!

【讨论】:

  • Ideally, don't convert the dates to strings in the first place +1 !