我需要根据时间戳进行过滤,并希望在某一天内获取所有内容。时间戳如下: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.
那么我可以使用什么来匹配日期? 编辑或者在这种情况下,不是日期?
答案 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 %'`