我需要检查用户输入的月 - 月组合是否落在表的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的值,但没有增益。
答案 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 ...)
为例)