我有一个表,其记录有一个日期,但这个日期保存为VARCHAR
,他们告诉我可以将其转换DATE
为SELECT
. 这就是我所拥有的:
SELECT * FROM tabla WHERE CONVERT (date(15), fecha, 103) = '1/01/2017';
但它给了我以下错误:
消息 291,级别 16,状态 1,第 13 行 CAST 或 CONVERT:为类型“日期”指定的属性无效
该表的记录采用这种格式VARCHAR
16/06/2016
20/06/2016
20/06/2016
16/07/2016
想象一下这样的数据:
最后我故意输入了一个不正确的值:
40/01/2017
.我的测试列名为
fecha_var
.这个查询:
它将获取数据,但会出现以下错误:
并写成这样:
它只会获取前三行并给出与以前相同的错误。
解决方案
分配不匹配的数据类型时的一个大问题(
VARCHAR
当它应该是 a时使用 a 时就是这种情况DATETIME
),是输入数据时出现的错误。这意味着该列中可能存在无效日期。然后你必须考虑这种可能性。
让我们看看两种可能的解决方案。
解决方案 1:SQL-SERVER 2012+
在 SQL-Server 2012 及更高版本中,有以下功能
TRY_CONVERT
:查询
TRY_CONVERT
将是:解决方案2:SQL-Server 2012-
你可以用这个查询来解决它:
结果:
如您所见,
01.01.1900
当值错误时,查询返回 Epoch 日期 ( )。从根本上解决问题
尽管您说您无权修改数据库。如果你这样做了,问题将通过在表中创建一个新列来解决,例如
FECHADATE
,并执行以下操作UPDATE
:SQL Server 2012+
SQL-Server 2012-
结果:
然后,您必须进行检查,检查带有 Epoch (01-01-1900) 的日期,表明旧列中的值
VARCHAR
不是有效日期。您将不得不以某种方式进行更正,找出该列中应该出现的正确日期。[broma]Esperemos que no hayan despedido al que digitó esos datos y se acuerde cual era la fecha correcta y que explique por qué estaba dormido ese día y cuántos errores como ese habrá cometido.[/broma]
正如@Marcos Pérez 的回答中已经解释的那样,转换的正确语法是:
但是您必须将相同的转换应用于您比较的日期:
...或者,为了简化一点,您可以使用
YYYYMMDD
不需要显式转换的格式:如果尽管进行了这些更改,您仍然会遇到错误,这意味着并非所有数据都遵循
DD/MM/YYYY
您在问题中提到的格式。这些是使用错误类型来保存数据的风险。获取格式不正确的记录并进行更正将取决于您。您只需使用变量类型 datetime 而不是 date(15) 来进行转换即可正常工作。我附上原始帖子的链接以防您想查看,以及最终查询。原帖