代码之家  ›  专栏  ›  技术社区  ›  revy

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

  •  0
  • revy  · 技术社区  · 6 年前

    "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 回复  |  直到 6 年前
        1
  •  1
  •   hlagos    6 年前

    我同意@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"

    select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;
    
        2
  •  0
  •   Gordon Linoff    6 年前

    解决方法很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试对日期使用字符串函数,因此 mdate

    通常,如果您希望所有日期都在5月期间,您可以使用:

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

    日期 有时间成分。