在oracle中计算日期

时间:2015-02-10 10:33:21

标签: oracle date

我写查询以检查最后一天是否是星期五,但总是看到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。

2 个答案:

答案 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>