我有一张如下表:
[TMP_TBL]
(
...
[DT_REFUND] [varchar(20)] NULL,
[MSG_PROCESS] [nvarchar(max)] NULL,
...
)
它包含这样的数据:
| DT_REFUND | MSG_PROCESS |
| A-BC---D | WRONG DATETYPE |
| 20180301 | NULL |
| 20180331 | NULL |
当我进行如下查询时:
select *
from TMP_TBL
where isnull(MSG_PROCESS, '') = ''
一切都很顺利。
但是当我查询时:
select *
from TMP_TBL
where isnull(MSG_PROCESS, '') = ''
and convert(DATE, DT_REFUND) >= convert(DATE, '20180301');
我收到错误:
从字符串
转换日期和/或时间时转换失败
为什么会发生这种情况,以及如何解决?
由于
答案 0 :(得分:1)
理想情况下,您应避免在日期中使用VARCHAR
数据类型。
对于当前情况,您可以使用TRY_CONVERT
,如下所示。
select *
from TMP_TBL
where isnull(MSG_PROCESS, '') = ''
and TRY_CONVERT(DATE, DT_REFUND) >= convert(DATE, '20180301');
由于您的日期列为VARCHAR
,因此可能还有空格,要处理此问题,您可以在转换为日期之前尝试RTRIM
功能,如下所示。
TRY_CONVERT(DATE, RTRIM(DT_REFUND)) >= convert(DATE, '20180301');
答案 1 :(得分:0)
首先,使用DATE
函数检查列中的值是ISDATE
格式还是其他格式。并与日期值进行比较。
如果它不是日期格式,则返回NULL
值。
试试这个:
SELECT *
FROM TMP_TBL
WHERE ISNULL(MSG_PROCESS,'') = ''
AND CONVERT(DATE, CASE WHEN ISDATE(DT_REFUND)=1 THEN DT_REFUND ELSE NULL END) >= CONVERT(DATE, '20180301');
答案 2 :(得分:0)
您只需要过滤掉空值并通过cast()
或convert()
函数
select *
from TMP_TBL
where MSG_PROCESS is null and
cast(DT_REFUND as date) >= '20180301';
这假定null
值始终为您的样本数据建议的日期
另一方面,首先您可以通过DT_REFUND
功能检查TRY_CONVERT()
是否有某种日期格式数据。所以,你的where子句应该做
where MSG_PROCESS is null and TRY_CONVERT(date, DT_REFUND) is not null and
cast(DT_REFUND as date) >= '20180301';
但是,上面在cast
之前有一些冗余过滤,所以你也可以表示为
where MSG_PROCESS is null and TRY_CONVERT(date, DT_REFUND) >= '20180301';