【问题标题】:Convert NVARCHAR DATE to DATETIME using CHARINDEX使用 CHARINDEX 将 NVARCHAR DATE 转换为 DATETIME
【发布时间】:2018-09-18 12:58:57
【问题描述】:

尝试将 nvarchar 列转换为日期时间时出现以下错误。

Select *
from table 1
where
convert(datetime, col1) >= '2018-08-29 00:00:00.000'

错误信息

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

Col1 是 NVARCHAR 列(我无法控制此数据类型,因此无法更改)

我已经看到了一些 charindex 的示例,但似乎无法让它工作,非常感谢任何帮助让代码正确工作的帮助。

更新 - '2018-08-29 00:00:00.000' 是一个日期时间列,需要保留它以便执行 where 子句。

【问题讨论】:

  • 您能给我们提供一个无效数据样本吗?很可能只是格式问题或美国与世界其他地区的数据问题
  • 这意味着 col1 中至少有一个值无法转换为日期时间。您可以使用 try_convert 轻松识别这些行。然后,如果可能,请停止在 varchar 中存储日期。
  • 一旦清理了错误的数据,您就需要考虑检查是什么插入了错误的数据以防止它发生。您可以在插入或更新之前添加触发器以强制异常,以防数据格式不正确(作为最后一个选项,触发器很讨厌)。查看 Gordon 关于如何检测不良数据的答案。
  • 您需要提供显示格式的示例数据或检查源数据是否有错误,如下面的答案中建议的那样。
  • 源格式没有错误。与我的问题中所述的日期时间相比,数据类型是 nvarchar 。日期在 nvarchar 列中显示为 2018 年 7 月 24 日

标签: sql sql-server nvarchar ssms-2017


【解决方案1】:

使用try_convert():

Select *
from table 1
where try_convert(datetime, col1) >= '2018-08-29'  -- time is not necessary

要查找导致问题的值:

select col1
from t
where try_convert(datetime, col1) is null and col1 is not null;

注意:您可能需要格式参数进行转换。不过,最后,您应该修复数据以使用正确的 col1 类型。

【讨论】:

  • 谢谢,抱歉,日期时间的格式无法更改,必须更改 col1。
  • @BeckyPurland 。 . .我错过了你评论的重点。我对常量所做的唯一更改是删除时间——它看起来是多余的,但你可以把它留在里面。答案是关于col1
  • Try_convert 恐怕不起作用。我正在寻找一种使用 CHARINDEX 的方法。我认为这会起作用,但只是无法弄清楚如何将它放入我的代码中,因为我之前没有使用过这个函数
【解决方案2】:

您可以在查询开始之前定义SET DATEFORMAT YMD。 看看下面的查询,

SET DATEFORMAT YMD
Select *
from table 1
where
convert(datetime, col1) >= '2018-08-29 00:00:00.000'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多