【问题标题】:Query: Assigning error datetime2查询:分配错误 datetime2
【发布时间】:2013-07-21 16:02:29
【问题描述】:

我想使用此代码分配'1392-04-31'

DECLARE @t DATETIME
SET @t = '92-04-31'

我看到了这个错误:

Conversion failed when converting date and/or time from character string.

有人知道为什么吗?

【问题讨论】:

  • 你认为这应该如何隐式映射'92-04-31' -> '1392-04-31'?

标签: sql sql-server type-conversion


【解决方案1】:

首先,四月只有 30 天。我不会花时间查看历史上是否是 1392 年的情况,但无论哪种方式,我都很确定 1392 年 4 月 31 日的日期对于 SQL Server DATETIME 是无效的。

此外,您应该使用格式为“01-01-2013”​​的全年。

尝试以下操作,您将获得输出 Jan 1 2013 12:00AM。

declare @t DATETIME
set @t = '01-01-2013'
PRINT @t

以上内容适用于任何有效日期。

【讨论】:

  • 您的回答并不清楚是月份还是日期先到。此日期格式也将在另一种语言中失败。例如: SET LANGUAGE 英国 go declare @t DATETIME set @t = '02-20-2013' PRINT @t
  • 在您给出的特定示例中,您的答案可能是正确的,但实际上会误导人们相信 MM-DD-YYYY 或 DD-MM-YYYY 是一种可以安全使用的格式SQL。如果您阅读了我在下面提供的链接中的文章,那么您下次就不会犯这个错误了。不要把这当成个人,但我们都在这里学习,即使是那些回答问题的人。
【解决方案2】:

您尝试设置的日期可能无效。

根据语言、日期格式和其他设置,在 SQL 中将日期表示为字符串的方法有多种。通常最安全的方法是使用“YYYYMMDD”格式。

下面的文章也会回答这个问题:为什么 1753 是 datetime 的最早日期?

如果您想了解详细信息,请阅读此内容:

http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

【讨论】:

    【解决方案3】:

    解决办法是: 使用日期时间2!

    DECLARE @t datetime2
    SET @t = '1392-04-30'
    

    因为您不能使用日期时间: datetime 中存储的最小日期是 1753 年 1 月 1 日。所以 1392 是不可存储的。

    四月有 30 天。

    使用格式化日期和日期时间:

    其次,当你在 Sql Server 中写日期时,我喜欢的格式是 {d 'YYYY-MM-DD'},所以在你的情况下变成:

    DECLARE @t DATETIME
    SET @t = {d '1992-04-30'}
    

    要完成这个讨论,如果你想使用 hh mm ss 所以你必须使用这个格式:{ts 'yyy-mm-dd hh:mm:ss.mmm'}

    DECLARE @t DATETIME
    SET @t = {ts '1992-04-30 23:59:59.123'}
    

    【讨论】:

      【解决方案4】:

      试试这个:

      declare @t DATETIME
      set @t = '1992-04-30 10:54:30'
      

      【讨论】:

      • 您无法将波斯语 dateTime 插入 SQL。您必须将其转换为朱利安。当你想在 SQL 中插入 92-04-31 时,这意味着你正在插入 1992-04-31 并且我们在 4 月有 30 天,然后你得到了错误。
      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多