发现开发人员在针对日期字段作SQL的Where条件时,每个人的写法五花八门,已看到的有以下写法:
1、AND to_char(sh.creation_date, 'YYYY-MM-DD') >= '2009-08-26'
2、AND to_date(to_char(sf.creation_date, 'YYYY-MM-DD'), 'YYYY-MM-DD') >= to_date('2009-08-26', 'YYYY-MM-DD');
3、AND sh.creation_date >= to_date('2009-08-26','YYYY-MM-DD')
4、AND trunc(sh.creation_date) >= to_date('2009-08-26','YYYY-MM-DD')
正确的写法应该如下:
1、如果creation_date字段未建任何索引,可采用第3、4种写法,但是这种针对日期的查询,最好是对该字段创建索引;
2、如果creation_date字段创建了字段级索引,则必须采用第3种写法,否则索引利用不起来,有可能导致全表扫描;
3、如果creation_date字段创建了函数索引(TRUNC(CREATION_DATE)),则必须采用第4种写法,否则索引利用不起来,有可能导致全表扫描。
今后规定大家统一按照第4种写法,设计人员在创建索引时,可针对日期字段创建函数索引。
1、AND to_char(sh.creation_date, 'YYYY-MM-DD') >= '2009-08-26'
2、AND to_date(to_char(sf.creation_date, 'YYYY-MM-DD'), 'YYYY-MM-DD') >= to_date('2009-08-26', 'YYYY-MM-DD');
3、AND sh.creation_date >= to_date('2009-08-26','YYYY-MM-DD')
4、AND trunc(sh.creation_date) >= to_date('2009-08-26','YYYY-MM-DD')
正确的写法应该如下:
1、如果creation_date字段未建任何索引,可采用第3、4种写法,但是这种针对日期的查询,最好是对该字段创建索引;
2、如果creation_date字段创建了字段级索引,则必须采用第3种写法,否则索引利用不起来,有可能导致全表扫描;
3、如果creation_date字段创建了函数索引(TRUNC(CREATION_DATE)),则必须采用第4种写法,否则索引利用不起来,有可能导致全表扫描。
今后规定大家统一按照第4种写法,设计人员在创建索引时,可针对日期字段创建函数索引。