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

Oracle中SQL查询显示的记录少于满足条件的记录,oracle,datetime,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/

我需要检查用户输入的月-年组合是否在表的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
选择emp\u代码,
TO|CHAR(TO|DATE(from|dt),'MM')=TO|CHAR(TO|DATE((1 | |'/'):for|mon | |'/'| |:for|u year),'DD/MM/yyyyyyy'),'MM')
然后最后一天(截止日期((1 | | |'/'| |:对于周一| |'/'| |:对于年),'DD/MM/YYYY')-截止日期(从日期)+1
何时到字符(到日期(从日期起),'DD/MM/YYYY')=到字符(最后一天)到日期((1 | |'/'):对于周一| |'/'||
:对于年,,'DD/MM/YYYY'),'DD/MM/YYYY')
然后是最后一天(截止日期((1 | | |'/'| |:周一| |'/'|:一年),'DD/MM/YYYY'))
-截止日期((1 | |'/'| |:对于|周一|'/'| |:对于|年),'DD/MM/YYYY')+1
其他0
告辞
从测试表
但此查询仅显示给定月-年组合的一名员工的休假计数,而其他员工的休假计数也应显示为他们的from_dt和to_dt也在同一个月-年中下降。 此外,它也不例外


我也尝试过设置NLS_COMP和NLS_SORT的值,但没有效果。

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

TO_CHAR(TO_DATE(from_dt),'DD/MM/YYYY')
         <=to_char(TO_DATE((1||'/'||:for_mon||'/'||:for_year),'DD/MM/YYYY'),'DD/MM/YYYY')
如您所见,这种格式不保留“自然”的日期顺序,因此不适合进行日期比较。另一方面,
YYYY/MM/DD
是:

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

要么切换到该日期格式,要么更好,摆脱那些日期到字符串的比较,使用普通的日期算术(比如看一下)

在比较日期时,应该使用日期算术,而不是字符串比较。至少,后者容易出错。。。在许多情况下,这会导致几乎无法阅读的代码。
TO_CHAR(DATA,'YYYY/MM/DD')
2013/10/14
2014/11/24
2014/12/01