在SQL Server中筛选数据

时间:2018-04-12 04:36:18

标签: sql sql-server

我有一张如下表:

[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');

我收到错误:

  

从字符串

转换日期和/或时间时转换失败

为什么会发生这种情况,以及如何解决?

由于

3 个答案:

答案 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';