【问题标题】:Converting date format gives "Conversion failed when converting date and/or time from character string"转换日期格式给出“从字符串转换日期和/或时间时转换失败”
【发布时间】:2019-09-04 19:38:31
【问题描述】:

表格中的日期格式为 YYYYMMDD,我想将其转换为以下格式,但失败并出现错误:

2019-07-23 00:00:00.000

从字符串转换日期和/或时间时转换失败

这是我正在使用的语句:

convert(varchar(10), convert(datetime, InstallDate0), 23)

【问题讨论】:

  • 如果 2012+ 使用 try_convert()。如果转换失败,它将返回一个 NULL 值。
  • 您为什么要尝试更改“格式”? SQL Server 中的日期和时间值没有“格式”;它们是二进制值。 SQL Server 中存在日期和时间数据类型是有原因的;存储数据和时间值。不要将日期存储为varchar,这是错误数据类型。如果您需要“格式”,那就是表示层的职责。如果由于某种未知原因,您无法让表示层完成其工作,请使用(持久的)计算列来提供格式化值;但当然不要将实际值存储为varchar
  • 你也可以试试where InstallDate0 not like '[12][90][0-9][0-9][0-2][0-9][0-3][0-9]'
  • 我的问题是我使用的表中的日期是数据类型 nvarchar 并且格式不可用(即 - 20140908 而不是 2014-09-08 00:00:00.000和日期时间格式)

标签: sql sql-server


【解决方案1】:

真正的问题是数据类型的选择。 varchar 是错误的选择。结果,您现在似乎有一些行的“日期”值已丢失,因为它无法转换为日期。

要正确解决此问题,请修复您的数据类型。首先,我将创建一个新列来存储错误值:

ALTER TABLE YourTable ADD BadDate varchar(20); --as it's yyyyMMdd you don't need more than 8 characters, but we'll assume you have some really bad values
UPDATE YourTable 
SET BadDate = InstallDate0
WHERE TRY_CONVERT(datetime,InstallDate0) IS NULL;

现在你已经完成了,是时候更新现有的列了:

UPDATE YourTable
SET InstallDate0 = CONVERT(varchar(8),TRY_CONVERT(datetime, InstallDate),112);

这会将每个值设置为可以转换值的yyyyMMdd 格式。现在你可以改变你的桌子了:

ALTER TABLE YourTable ALTER COLUMN InstallDate0 date; --AS it's yyyyMMdd, it seems silly to actually use datetime

现在你有一个正确的datetime 列。

然后,您需要检查 BadDate 的值并尝试更正它们(或承认他们持有的任何信息已经永远丢失)。

如果您“必须”有另一列的格式,那么再添加一列:

ALTER TABLE YourTable ADD InstallDate0_f AS CONVERT(varchar(23),InstallDate0,121);

【讨论】:

  • 谢谢,但我只能做选择语句,我不能改变表。我的问题是我使用的表中的日期是数据类型 nvarchar 并且格式不可用(即 - 20140908 而不是 2014-09-08 00:00:00.000 和日期时间格式)
  • 20140908 怎么不“可用”@user3009669?即 ISO 格式 yyyyMMdd。事实上,日期2014-09-08 00:00:00.000datetime 一起使用较少,因为根据您的语言,您会得到不同的结果。 (BRITISH 将给出日期 09 September 2014 而“ENGLISH”将给出 08 August 2014)。
  • 我正在尝试对当前格式的日期使用 DATEDIFF 语句,但它不起作用。我收到错误报告,“从字符串转换日期和/或时间时转换失败。”
  • 如果我尝试语句 convert(nvarchar(255), convert(datetime, InstallDate0), 23) 它会返回我正在寻找的内容,但在它返回我正在寻找的内容后立即失败报告相同的错误“从字符串转换日期和/或时间时转换失败。”
  • 因为你的日期不好,@user3009669;就像我说的。这就是为什么你永远不应该将日期和时间值存储为varcharm,因为可以(并且将会)愚蠢地存储像'20192432' 这样的日期。
【解决方案2】:

您可以使用TRY_CONVERT() 确定问题出在哪里。问题似乎是转换为datetime,所以试试这个:

select InstallDate0
from t
where try_convert(datetime, InstallDate0) is null;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多