【问题标题】:Record in SQL Server table causing a error - how to find the record?SQL Server 表中的记录导致错误 - 如何查找记录?
【发布时间】:2013-05-12 22:29:21
【问题描述】:

我创建了一个查询来获取用户的出生日期并将年份更改为当前年份(不想显示实际出生日期)

CAST(
  CAST(YEAR(GETDATE()) as varchar) + '-' +
  CAST(MONTH(BirthDay) as varchar) + '-' +
  CAST(DAY(BirthDay) as varchar) 
as date)

当我对我的表运行它时,我收到以下错误:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

我能够让查询在 SQLFiddle 上正常工作

为了对查询进行故障排除,我逐步检查了每个 CAST() 函数,每个函数都单独工作。当我将GETDATE() 更改为BirthDay 时,查询可以正常工作,但这不喜欢使用GETDATE()。该函数将运行并获取大约 400 条记录,然后返回上面的错误消息。

有没有办法找到导致此问题的实际记录,或者有更好的方法来获取日期的月份和日期并将其设为 2013 年?

【问题讨论】:

  • 是为所有用户设置了BirthDay,还是还包含NULL 值?
  • @NielsKeurentjes 不是为所有用户设置的,所以我尝试了WHERE BirthDay IS NOT NULL,结果相同。
  • 生日是 2 月 29 日吗?没有 2013 年 2 月 29 日。如果将CAST(YEAR(GETDATE()) as varchar) 替换为硬编码字符串'2013' 会发生什么?
  • @AdamPorad +1,没想到 2 月 29 日呵呵。

标签: sql-server date casting


【解决方案1】:

我认为闰年是你的问题,其中一个生日值是闰年的 2 月 29 日。所以发生错误是因为没有 2013 年 2 月 29 日。

验证这个假设:

  • 如果将CAST(YEAR(GETDATE()) as varchar) 替换为硬编码字符串'2013',会发生什么情况?
  • 如果您将其替换为'2012',那是闰年呢?
  • 或者正如 Niels Keurentjes 在 cmets 中巧妙地建议的那样,只需查询数据以查看是否有 2 月 29 日生日select * from Users where month(BirthDay) = 2 and day(BirthDay) = 29

【讨论】:

  • 不妨用select * from Users where month(BirthDay) = 2 and day(BirthDay) = 29确认一下
  • 就是这样。永远不会想到这一点。感谢您对此的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多