sql NOT LIKE语法

时间:2014-05-16 13:11:58

标签: sql teradata

我需要根据时间戳进行过滤,并希望在某一天内获取所有内容。时间戳如下:02/06/2014 7:45:59 AM或翻译2014-02-06 07:45:59

select * 
from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM 
where service_type_id = 134469888 and valid_from_tsp not like '2014-02-06 %'

当我运行此查询时,我返回错误:Partial String matching requires character operands

在搜索此错误后,我获得了The user used the partial string matching operator (LIKE) with an argument that was not a character string.

那么我可以使用什么来匹配日期? 编辑或者在这种情况下,不是日期?

4 个答案:

答案 0 :(得分:3)

以下是表达日期条件的更好方法:

select * 
from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM 
where service_type_id = 134469888 and
      valid_from_tsp >= DATE '2014-02-06' and
      valid_from_tsp < DATE '2014-02-07';

或:

select * 
from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM 
where service_type_id = 134469888 and
      valid_from_tsp >= DATE '2014-02-06' and
      valid_from_tsp < DATE '2014-02-06' + interval '1' day;

差异很重要。通常,当您对列具有函数时,数据库不使用索引。因此,这些表单将使用列上的索引。此查询的最佳索引是T_CLAIM_SERVICE_TYP_DIM(service_type_id, valid_from_tsp)

答案 1 :(得分:1)

您应该能够投射到某个日期并与您想要的日期进行比较,例如;

SELECT * 
FROM P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM 
WHERE service_type_id = 134469888 
 AND CAST(valid_from_tsp AS DATE) = '2014-02-06'

编辑:如果你有一个大表,这个查询将不会很好地使用索引。如果这很重要,请在午夜和下午午夜之间进行范围检查;

SELECT * 
FROM P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM 
WHERE service_type_id = 134469888 
 AND valid_from_tsp >= '2014-02-06' AND valid_from_tsp < '2014-02-07'

答案 2 :(得分:0)

使用

select * from P_FAR_SBXD.T_CLAIM_SERVICE_TYP_DIM 
where service_type_id = 134469888 and 
not DATEADD(dd, 0, DATEDIFF(dd, 0, valid_from_tsp)) = DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

答案 3 :(得分:0)

LIKE运算符用于文本。

只是猜测(您没有提供表结构),但可能valid_from_tsp不是varchar列,而是时间戳或日期列。

所以,而不是

valid_from_tsp not like '2014-02-06 %'

你应该用这个:

cast(valid_from_tsp as varchar(20)) not like '2014-02-06 %'`