我写查询以检查最后一天是否是星期五,但总是看到2而不是4。 任何建议该查询有什么问题?
(
SELECT (
CASE
WHEN To_char(due_date,'DAY','nls_date_language=english')='FRIDAY' THEN 4
ELSE 2
END)
FROM capagency.pa_instances pa,
capagency.users u
WHERE pa.idusr = u.idusr
AND pa.entity_id = a.ceid
AND p.payment_date BETWEEN pa.begin_date AND pa.due_date.
好的,我添加了修剪,但仍然导致我得到的是错误的,而不是值4我得到了值2.
(
select convert(u.Full_Name, 'UTF8')
from Capagency.Pa_Instances Pa,
Capagency.Users u
where Pa.Idusr = u.Idusr
AND Pa.Entity_Id = a.Ceid
and p.payment_date BETWEEN pa.begin_Date and Pa.DUE_DATE + (
CASE WHEN (TRIM(TO_CHAR(due_date,'DAY','nls_date_language=english'))='FRIDAY')
THEN 4 ELSE 2 END)
and rownum = 1
) "Collector",
首先我得到了
(select case
when (TRIM(To_char(due_date,'DAY','nls_date_language=english'))) = 'FRIDAY'
THEN 4 else 2 END
from Capagency.Pa_Instances Pa,
Capagency.Users u
where Pa.Idusr = u.Idusr
AND Pa.Entity_Id = a.Ceid
and p.payment_date BETWEEN pa.begin_Date and Pa.DUE_DATE
所以我看到那天是星期五,但仍然从else
获得价值2。我知道between
是如何工作的,并且在星期五没有工作正常的某些日子里,我获得了正确的值。
我想知道为什么如果我检查
case when (TRIM(To_char(due_date,'DAY','nls_date_language=english'))) = 'FRIDAY'
总是假的,所以我的价值总是2而不是4。
答案 0 :(得分:2)
这应该有希望证明正在发生的事情:
select to_char(to_date('13/02/2015', 'dd/mm/yyyy'), 'DAY','nls_date_language=english') dy,
replace(to_char(to_date('13/02/2015', 'dd/mm/yyyy'), 'DAY','nls_date_language=english'), ' ', '*') dy_show_spaces,
to_char(to_date('13/02/2015', 'dd/mm/yyyy'), 'fmDAY','nls_date_language=english') fmdy,
replace(to_char(to_date('13/02/2015', 'dd/mm/yyyy'), 'fmDAY','nls_date_language=english'), ' ', '*') fmdy_show_spaces
from dual;
DY DY_SHOW_SPACES FMDY FMDY_SHOW_SPACES
--------- -------------- ------ ----------------
FRIDAY FRIDAY*** FRIDAY FRIDAY
请参阅also。
简而言之,fm
修饰符无需在结果字符串上使用TRIM
。
答案 1 :(得分:1)
来自文档,
DAY格式模型 -
白天的名字,用空白填充以显示最宽的名称的宽度 用于此元素的日期语言中的日期。
您需要 TRIM 右侧填充 DAY 格式的空格。将您的查询修改为 -
TRIM(To_char(due_date,'DAY','nls_date_language=english'))='FRIDAY'
例如,
SQL> SELECT LENGTH(trim(TO_CHAR(hiredate, 'DAY', 'nls_date_language=AMERICAN'))) dt_trim,
2 LENGTH(TO_CHAR(hiredate, 'DAY', 'nls_date_language=AMERICAN')) dt,
3 TO_CHAR(hiredate, 'DAY', 'nls_date_language=AMERICAN') DAY
4 FROM emp
5 /
DT_TRIM DT DAY
---------- ---------- ---------
9 9 WEDNESDAY
6 9 FRIDAY
6 9 SUNDAY
8 9 THURSDAY
6 9 MONDAY
6 9 FRIDAY
7 9 TUESDAY
8 9 THURSDAY
7 9 TUESDAY
7 9 TUESDAY
9 9 WEDNESDAY
DT_TRIM DT DAY
---------- ---------- ---------
8 9 THURSDAY
8 9 THURSDAY
8 9 SATURDAY
14 rows selected.
SQL>
所以你看到空格正确填充到DAY
列?我会说更好地使用DY
格式,它只有3个字符。
或者,使用 TRIM 。让我们使用 EMP 表中的 HIREDATE 列查看类似的测试用例 -
SQL> SELECT
2 CASE
3 WHEN trim(TO_CHAR(hiredate, 'DAY', 'nls_date_language=AMERICAN'))='FRIDAY'
4 THEN 4
5 ELSE 2
6 END dt,
7 TO_CHAR(hiredate, 'DAY', 'nls_date_language=AMERICAN') dt_1
8 FROM emp
9 /
DT DT_1
---------- ---------
2 WEDNESDAY
4 FRIDAY
2 SUNDAY
2 THURSDAY
2 MONDAY
4 FRIDAY
2 TUESDAY
2 THURSDAY
2 TUESDAY
2 TUESDAY
2 WEDNESDAY
DT DT_1
---------- ---------
2 THURSDAY
2 THURSDAY
2 SATURDAY
14 rows selected.
SQL>