Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql不喜欢语法_Sql_Teradata - Fatal编程技术网

sql不喜欢语法

sql不喜欢语法,sql,teradata,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 %' 运行此查询时,返回错误:部分字符串匹配需要字符操作数 搜索此错误时,我得到用户使用了

我需要根据时间戳进行过滤,并希望在某一天内获取所有内容。时间戳如下:
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 %'
运行此查询时,返回错误:
部分字符串匹配需要字符操作数

搜索此错误时,我得到
用户使用了部分字符串匹配运算符(LIKE)和非字符串的参数。


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

您应该能够选择一个日期,并与您想要的日期进行比较,例如

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'
选择*
从P_FAR_SBXD.T_索赔_服务_TYP_DIM
其中服务类型id=134469888
和来自tsp的有效信息>='2014-02-06'和来自tsp的有效信息<'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-07';
选择*
从P_FAR_SBXD.T_索赔_服务_TYP_DIM
其中服务类型id=134469888和
有效期自日期“2014-02-06”和
有效期自2014年2月7日起;
或:

选择*
从P_FAR_SBXD.T_索赔_服务_TYP_DIM
其中服务类型id=134469888和
有效期自日期“2014-02-06”和
自tsp开始生效<日期'2014-02-06'+间隔'1'天;
区别很重要。通常,在列上有函数时,数据库不使用索引。因此,这些表单将在列上使用索引。此查询的最佳索引是
T\u索赔\u服务\u类型\u DIM(服务\u类型\u id,有效\u来自\u tsp)

使用

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))

LIKE运算符用于文本

只是一个猜测(您没有提供表结构),但可能
valid\u from\u tsp
不是一个varchar列,而是一个timestamp或date列

因此,与其

valid_from_tsp not like '2014-02-06 %'
您应该使用以下选项:

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

来自\u tsp的有效\u是时间戳还是字符串?如果是时间戳,则应使用日期函数。我不知道teradata,但是类似这样的东西:
cast(valid\u from\u tsp as date)='2014-02-06'
什么是
valid\u from\u tsp
的数据类型?timestamp
02/19/2014 7:45:59 AM
@staples Hm,这应该有效,很难判断出什么地方出了问题。行的id为134469888,还有另一个日期?我再次检查了我的数据,我错了,它确实起作用。这在长列表中是无效的,因为在处理逻辑之前,强制转换将应用于来自\u tsp的所有有效\u值,否定任何索引。@Matt True,添加了一个执行范围检查的版本,该版本可以预先计算。
cast(valid_from_tsp as varchar(20)) not like '2014-02-06 %'`