我有一个配置单元表,其中有一个字符串格式的日期字段,如下所示
"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
你知道为什么会这样吗?
2条答案
按热度按时间zzlelutf1#
解决方法很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试对日期使用字符串函数,因此
mdate
需要转换为字符串。这是一个隐式转换,因此它使用在当时使用的系统上设置的任何系统默认值。在许多数据库中,它也会对性能产生很大的影响。通常,如果您希望所有日期都在5月期间,您可以使用:
即使在
mdate
有时间成分。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也可以)。