在SELECT语句中使用decode进行SQL语言编程

时间:2017-04-26 14:19:00

标签: sql oracle decode

我有两个名为START_DATE和END_DATE的参数。

如果输入了开始日期和结束日期,我想使用TO_CHAR转换为不同的格式并以'MON DD,YYYY'格式显示“:start_date - :end_date”)

但是,如果没有输入参数,我想使用TO_CHAR函数显示前一个月的信息,即2017年3月1日至2017年3月31日。

以下是代码。有人可以识别我的错误并提供帮助吗?

SELECT DECODE (TO_CHAR(:START_DATE, 'MON DD, YYYY',(trunc(trunc(sysdate,'MONTH')-1,'MONTH'))),'MON DD, YYYY')
   || ' - ' || DECODE (TO_CHAR(:END_DATE, 'MON DD, YYYY',(trunc(sysdate,'MONTH')-1)'MON DD, YYYY') BILLPERIOD

如何使用解码功能在sql中编写?

2 个答案:

答案 0 :(得分:0)

如果您可以在项目中使用CASE,请尝试:

SELECT
  CASE START_DATE
    WHEN NULL THEN TO_CHAR(PREVIOUS_DATE, 'MON DD, YYYY')
    ELSE TO_CHAR(START_DATE, 'MON DD, YYYY')
    END || ','
  CASE END_DATE
    WHEN NULL THEN TO_CHAR(PREVIOUS_DATE, 'MON DD, YYYY')
    ELSE TO_CHAR(END_DATE, 'MON DD, YYYY')
    END "Formated Date"
FROM BILLPERIOD;

答案 1 :(得分:0)

我强烈建议您使用CASE语句。更多控制,更可读,更清洁等。当然,我的拙见。

SELECT 
  CASE 
    -- If one or both dates are NULL, revert to last month
    WHEN start_date IS NULL OR end_date IS NULL THEN
      to_char(trunc(trunc(sysdate,'MM')-1,'MM'), 'MON DD, YYYY') || ' - ' || to_char(trunc(sysdate,'MM')-1, 'MON DD, YYYY')
    WHEN start_date IS NOT NULL AND end_date IS NOT NULL AND
    (start_date < end_date) THEN
      to_char(start_date, 'MON DD, YYYY') || ' - ' || to_char(end_date, 'MON DD, YYYY')
    -- ** ALWAYS EXPECT THE UNEXPECTED!  **
    -- Like start_date >= end_date
    ELSE '**  DATE ERROR  **'
  END as billperiod
  FROM dual;

编辑:添加了对start_date的检查必须&lt; END_DATE。