在SQL Server表中查找与今天相关的日期时间条目时出现问题

问题描述

我有一个带有varchar列的表,表中有不同的值。该列中的某些值实际上是日期时间戳记,但以varchar数据类型编写。 我希望找到包含日期时间AND与今天相关的条目。 所以,我的桌子是这样的:

  ID  |  column_x
---------------------
  12  |  apple
  13  |  25.03.2018 14:13:58
  14  |  05.10.2020 10:43:17
  15  |  3620

以下查询有效

select [ID],[column_x],CAST(CONVERT(DATETIME,104) AS DATE) the_date
from [my_DB].[dbo].[my_table]
where (ISDATE([column_x])=1)

结果是这样的:

  ID  |       column_x          |  the_date
-------------------------------------------------
  13  |  25.03.2018 14:13:58    | 2018-03-25
  14  |  05.10.2020 10:43:17    | 2020-10-05
  15  |  3620                   | 3620-01-01

现在我想扩展引用的查询以查找属于今天的条目(2020.10.05)

以下查询给出错误:

select * from (
select [ID],104) AS DATE) the_date
from [my_DB].[dbo].[my_table]
where (ISDATE([column_x])=1) 
) s
where
(select CAST(CONVERT(DATETIME,s.[column_x],104) AS DATE))=
(SELECT CAST(GETDATE() AS DATE))

错误消息是:

Conversion failed when converting date and/or time from character string.

根据SQL本身,我只选择了日期时间的条目,所以我不明白为什么会出现此错误。

更奇怪的是,以下查询可以正常工作并打印输出:

if
(select CAST(CONVERT(DATETIME,'05.10.2020 19:46:19',104) AS DATE))=
(SELECT CAST(GETDATE() AS DATE))
print 'condition is fulfileld'

即使用有问题的数字(3620)替换日期也不会导致错误。在那种情况下只是不满足条件。

我不明白为什么会收到该错误。

解决方法

您可以使用try_convert()。 。 。但是为什么不将当前日期转换为相同的格式:

select [ID],[column_x]
from [my_DB].[dbo].[my_table]
where left(column_x,10) = convert(varchar(10),getdate(),104)

以另一种方式进行比较:

where try_convert(date,column_x,104) = convert(date,getdate())

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...