我有两个名为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中编写?
答案 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。