【问题标题】:Detect and convert DateTime column of DataTable to ShortDate dynamically动态检测 DataTable 的 DateTime 列并将其转换为 ShortDate
【发布时间】:2023-01-27 23:08:46
【问题描述】:

我们正在从 MS SQL 查询中填充多个数据表。在我们的查询本身中,我们使用 CAST 来确保日期是短日期。像这样:

CAST(jobs.[jobStDate] AS Date) AS JobStartDate

所以 myDate 正确显示为 12/4/2019。然后,我们稍后将使用以下内容导出这些数据:

For Each col As DataColumn In myDataTable.Columns
     myExportData += Chr(34) & col.ColumnName.ToString & Chr(34) & ":" & Chr(34) & row(col).ToString & Chr(34) & ","
Next

所以列名和它的值以这样的格式导出:

"JobStartDate":"12/3/2019 12:00:00AM"

这非常有效,因为我们可以即时更改查询,并且不需要更改导出功能,不需要设置 DataTables,一切都是动态的。问题是该值正在附加时间,我不确定为什么,因为它不在 SQL 数据中。因此,即使我们用短日期 12/3/2019 填充数据表,它也会添加时间。现在我们有一个 hacky 解决方法:

myValue = row(col).ToString.Trim
If String.IsNullOrEmpty(myValue) = False Then
     myValue = Replace(row(col).ToString, " 12:00:00 AM", "").Trim
 End If
myExportData += Chr(34) & col.ColumnName.ToString & Chr(34) & ":" & Chr(34) & myValue & Chr(34) & ","

这当然有效,但我想解决这个问题,这感觉就像一个创可贴。 DataTable 是否推断数据类型并默认为长日期时间字符串?如果是这样,有没有一种方法可以防止这种情况发生,或者有一种方法可以在我的循环中检测并修复它,或者只进行我已经在做的替换是否更容易。

【问题讨论】:

  • 格式化是前端的工作,而不是数据层的工作。但我觉得你的数据类型是数据库中的日期时间?对于您的导出,为什么不指定您想要的格式而不是依赖默认行为?
  • .ToString 是一个 .NET 方法,所以此时您的 SQL date 数据类型已经转换为 .NET DateTime 结构。如果您使用的是 .NET 6 或更高版本,您是否尝试过显式转换为新的 .NET DateOnly 结构?
  • 唯一要解决的问题是低效的格式化代码。 date 是一个二进制值,它根本没有格式。格式仅在将该二进制值格式化为字符串或解析字符串以获取 DateTimeDateOnly 时适用。如果您想从该日期生成一个字符串,您可以指定实际的格式/语言环境,而不是使用默认值。例如myExportData+=col.DateColumn.ToString("yyyy-MM-dd")

标签: sql-server vb.net datatable


【解决方案1】:

您可以将其转换为 varchar

convert(varchar(10), jobs.[jobStDate] , 103)

请参阅documentation

【讨论】:

  • 那不是一个好主意。 date 是一个二进制值,.NET 完全能够以应用程序需要的任何方式格式化 DateTime 对象,而不会因误解文本格式而导致错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 2015-03-12
相关资源
最近更新 更多