我有一个Hive表,其中的日期字段为String格式,如下所示
"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
关于为什么会发生这种情况的任何线索吗?
答案 0 :(得分:1)
我同意@Gordon的建议,但是它没有回答问题,在这种情况下,没有隐式转换,您正在比较2个字符串。在第一次比较中您得到的值较少,因为您将所有-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(正则表达式通常很昂贵,并且到目前为止也可以转换)。
select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;
答案 1 :(得分:0)
解决方案很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试在日期上使用字符串函数,因此mdate
需要转换为字符串。这是一个隐式转换,因此它将使用当时正在使用的系统上设置的任何系统默认值。在许多数据库中,它也会对性能产生很大影响。
通常,如果要在5月中显示所有日期,则可以使用:
SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate < '2013-06-01';
即使mdate
具有时间分量,此方法也可以使用。