【问题标题】:SQL Server: Using date in ISO 8601 format in WHERE clauseSQL Server:在 WHERE 子句中使用 ISO 8601 格式的日期
【发布时间】:2021-12-30 17:07:19
【问题描述】:

在 SQL Server 2014 中,我尝试了以下查询:

select * 
from MyTable 
where StartDate = '2021-12-31T00:00:00.0000000'

我收到此错误:

消息 295,第 16 级,状态 3,第 3 行
将字符串转换为 smalldatetime 数据类型时转换失败。

据我所知,这个字符串是 ISO 8601 格式,所以它应该被 SQL Server 接受(我读到这实际上应该是向 SQL Server 传递日期时的首选格式)。

有没有办法告诉 SQL Server 接受这种格式?

请注意:此查询实际上是由 Linq 在 Entity Framework Core DataContext 中生成的,因此我无法以任何方式更改查询本身。

【问题讨论】:

  • 降低时间组件的精度,因为它是smalldatetime,而不是datetimeselect * from MyTable where StartDate = '2021-12-31'
  • 也就是说,今天没有人应该使用smalldatetime。你为什么不用datetime2
  • 谢谢戴。正如我写的,这个查询是从 EF 生成的,所以我不能修改它......
  • 我是说你首先需要改变你的数据库设计。
  • 这看起来不像 EF Core 生成的查询。 EF Core 生成的查询将使用类型化的 parameter,它 “将日期传递给 SQL Server 时的首选格式”,即将它们作为日期而不是字符串传递。

标签: sql-server tsql entity-framework-core


【解决方案1】:
  • Older versions of EF Core did not support smalldatetime
  • This was fixed in version 2.2.0 in 2018.
  • 将您的 EF Core 版本更新到比 2.2.0 更新的版本。
  • 如果您正在使用现代 EF Core 版本,则应将其归档为 a regression bug
  • 但更好的是:首先不要在您的数据库设计中使用smalldatetime。请改用datetime2(n) 或其他适当的类型。
    • 在新的数据库设计中没有充分的理由使用smalldatetimenor other typestextntextimagetimestamp 等)
    • 并且您应该能够运行 ALTER TABLE 将列类型更改为 datetime2(7) 而不会出现兼容性问题,除非您的系统中设计得非常糟糕,在这种情况下您应该修复那个。
    • 如果您真的需要将数据公开为smalldatetime,因为某些可怕且不透明但对业务至关重要的二进制文件无法重建,那么您可以添加VIEW,@ 987654337@ 和其他 shim 可以透明地将 datetime2(n) 转换为 smalldatetime,而系统的其余部分可以在现代环境中运行。

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多