【问题标题】:SQL Server substring to date in a where caluseSQL Server 子字符串在 where 子句中的日期
【发布时间】:2016-10-10 15:43:07
【问题描述】:

我正在尝试将 varchar 中包含的日期与 where 子句中的 getdate() 进行比较。 varchar 变量始终如下所示:

最后上线时间:MM/DD/YY

一些样本数据:

Last Seen: 07/12/16
Last Seen: 08/01/16
Last Seen: 07/22/16
NULL
NULL
NULL
NULL
Last Seen: 07/28/16

将 varchar 转换为 datetime 并找到天差,如下所示:

datediff(day,CAST(substring(CA_NOTE, 12, 8) as datetime), getdate()) as dayspassed

问题是,当我将此编码粘贴在 where 子句中以将日期与 getdate() 进行比较时,我不断收到相同的错误。

where datediff(day,CAST(substring(CA_NOTE, 12, 8) as datetime), getdate()) > 90

Msg 241, Level 16, State 1, Line 3 转换时转换失败 字符串中的日期和/或时间。

我正在运行 SQL Server 2014 Management Studio。

已将 cmets 考虑在内

destination-data 使用 TRY_PARSE 的建议奏效了!谢谢大家。

【问题讨论】:

  • 你能给我们一些样本数据吗?
  • 感谢 cmets。 datediff(day,CAST(substring(CA_NOTE, 12, 8) as datetime), getdate()) > 90 给出与以前相同的错误消息。
  • ...这意味着您现在有一个不同的问题。这个新版本看起来没问题,所以我会回到@GuidoG 和他的请求,展示一些我们可以使用的示例数据。
  • 尝试改用TRY_PARSE。如果它返回任何空值,则该行无法转换。
  • 目标数据,这行得通。谢谢!

标签: sql-server substring where


【解决方案1】:

SQL 不知道如何处理getdate()-90 -- 减去 90 天? 90分钟? 90 年?

你需要使用dateadd之类的函数,例如

where convert(varchar(30),cast(substring(CA_NOTE, 12, 8) as datetime),102) < dateadd(dd, -90, getdate())

【讨论】:

  • @bassrek 可以解决您的问题。我的解决方案可以解决您的下一个问题。
【解决方案2】:

问题是您仍在将其转换为VARCHAR。试试这个:

CAST(substring(CA_NOTE, 12, 8) as datetime)

【讨论】:

  • 好收获。此查询存在多个问题!
猜你喜欢
  • 2013-09-09
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2012-06-24
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多