在配置单元中使用字符串比较和regexp时的不同结果

wbgh16ku  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(289)

我有一个配置单元表,其中有一个字符串格式的日期字段,如下所示

"2013-05-01 00:10:41.0"

我在以下查询中得到了不一致的结果:

SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate <= '2013-05-31';

--> gives 111930

SELECT COUNT(*)
FROM table
WHERE mdate regexp '^2013-05-\\d{2}.*';

--> gives 115038

你知道为什么会这样吗?

zzlelutf

zzlelutf1#

解决方法很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试对日期使用字符串函数,因此 mdate 需要转换为字符串。这是一个隐式转换,因此它使用在当时使用的系统上设置的任何系统默认值。在许多数据库中,它也会对性能产生很大的影响。
通常,如果您希望所有日期都在5月期间,您可以使用:

SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate < '2013-06-01';

即使在 mdate 有时间成分。

de90aj5v

de90aj5v2#

我同意@gordon的建议,但是它没有回答这个问题,在这个例子中没有隐式转换,您正在比较两个字符串。在第一次比较中,您得到的值较少,因为您释放了所有的-31值。你可以运行这个来检查。。 select "2013-05-31 00:00:00.0" <= '2013-05-31' ; --假 select "2013-05-30 00:00:00.0" <= '2013-05-31' ; --是的
这是因为你正在做一个词典比较。。。实际上 '2013-05-31' 小于 "2013-05-31 00:00:00.0" 如果我想用更便宜的方法来执行这个比较,我会说它是substr和compare(regex通常很贵,cast-to-date也可以)。

select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;

相关问题