Oracle中的SQL查询显示的记录少于满足条件的记录

时间:2014-12-12 09:27:03

标签: oracle datetime

我需要检查用户输入的月 - 月组合是否落在表的from_dt和to_dt列之间。我的查询如下:

SELECT emp_code,
CASE WHEN TO_CHAR(TO_DATE(from_dt),'MM') = TO_CHAR(TO_DATE((1||'/'||:for_mon||'/'|| :for_year),'DD/MM/YYYY'),'MM') 
       THEN LAST_DAY(TO_DATE((1||'/'||:for_mon||'/'|| :for_year),'DD/MM/YYYY')) -  TO_DATE(FROM_DT) +1


  WHEN TO_CHAR(TO_DATE(from_dt),'DD/MM/YYYY')<=
 to_char(TO_DATE((1||'/'||:for_mon||'/'||
 :for_year),'DD/MM/YYYY'),'DD/MM/YYYY')
        AND TO_CHAR(TO_DATE(to_dt),'DD/MM/YYYY')>=to_char(LAST_DAY(TO_DATE((1||'/'||:for_mon||'/'||
 :for_year),'DD/MM/YYYY')),'DD/MM/YYYY') 
       Then LAST_DAY(TO_DATE((1||'/'||:for_mon||'/'|| :for_year),'DD/MM/YYYY'))
            -TO_DATE((1||'/'||:for_mon||'/'|| :for_year),'DD/MM/YYYY')+1

ELSE 0
END AS Leave
FROM TestTable

但是这个查询只显示了给定月份组合的一个员工的休假计数,而其他员工和#39;也应该显示休假计数,因为他们的from_dt和to_dt也属于同一个月。 此外,它没有例外。

我已尝试设置NLS_COMP和NLS _SORT的值,但没有增益。

1 个答案:

答案 0 :(得分:0)

比较字符串时,使用lexicographically comparison。也就是说,您正在使用字典顺序。根据您的日期字符串格式,词典编纂顺序可能与“自然”日期顺序相同或不同:

TO_CHAR(TO_DATE(from_dt),'DD/MM/YYYY')
         <=to_char(TO_DATE((1||'/'||:for_mon||'/'||:for_year),'DD/MM/YYYY'),'DD/MM/YYYY')

例如,下表按字典顺序使用DD/MM/YYYY格式排序:

TO_CHAR(DATA,'DD/MM/YYYY')
01/12/2014
14/10/2013
24/11/2014

如您所见,此类格式不会保留“自然”日期顺序,因此适合日期比较。另一方面,YYYY/MM/DD是:

TO_CHAR(DATA,'YYYY/MM/DD')
2013/10/14
2014/11/24
2014/12/01

切换到该日期格式,或更好,摆脱那些日期到字符串比较并使用普通的日期算术(拿一个以EXTRACT(MONTH FROM ...)为例)