Sql Oracle中的日期比较,在给出错误的情况下
[错误]ORA-00905(21577:32):PL/SQL:ORA-00905:在处缺少关键字 截止日期(上次更新日期)>=截止日期(第一年10月1日)Sql Oracle中的日期比较,在给出错误的情况下,sql,oracle,date,Sql,Oracle,Date,[错误]ORA-00905(21577:32):PL/SQL:ORA-00905:在处缺少关键字 截止日期(上次更新日期)>=截止日期(第一年10月1日) 选择总和(转换值)总计、bectrn\u id、becat\u id 来自brvo_bemrc_交易 其中年份=p_年 和trn_类型=p_类型 和doc_type=p_doctype AND company=p_company 和bedfn_id=p_bedfn_id bectrn_id=v_bectrn_id 和becat_id=v_be
选择总和(转换值)总计、bectrn\u id、becat\u id
来自brvo_bemrc_交易
其中年份=p_年
和trn_类型=p_类型
和doc_type=p_doctype
AND company=p_company
和bedfn_id=p_bedfn_id
bectrn_id=v_bectrn_id
和becat_id=v_becat_id
和案例
当(1,2,3)中的(从SYSDATE开始的月份)提取时
截止日期(上次更新日期)>=截止日期(第一年10月1日)和
截止日期(上次更新日期)=截止日期(第一年1月1日)和
截止日期(上次更新日期)=截止日期(第一年4月1日)和
截止日期(上次更新日期)=截止日期(第一年7月1日)和
截止日期(上次更新日期)您的案例。。什么时候然后。。结束
不正确
让我们采取最后的行动,看看什么时候出了问题
WHEN ( -- condition for thus WHEN starts from here
extract(month FROM SYSDATE) IN (10,11,12)
) -- condition for thus WHEN ends here
THEN -- THEN must contain value which will be the result of case statement if when condition is true
-- but your query has expression here
-- you need to put any value here
to_date(last_update_date) >= to_date(concat('01-JUL-',p_year-1))
AND to_date(last_update_date) <= to_date(concat('30-SEP',p_year-1))
END
是的,正如@Wernfried Domscheit在评论中所建议的那样,您可以根据逻辑简化查询
干杯 我认为你的条件可以写得更简单,如下所示:
WHERE ...
AND TRUNC(last_update_date, 'Q') = TRUNC(ADD_MONTHS(SYSDATE, -3), 'Q')
您需要正确设置日期的格式
where子句中的case..when
语句的结果
不应该是布尔表达式,它们应该按
截止日期(上次更新日期)>=情况为…
和
截止日期(上次更新日期)
分为两部分,
分别
因此,请使用:
SELECT SUM(trans_value) total, bectrn_id, becat_id
FROM brvo_bemrc_transactions
WHERE year = p_year
AND trn_type = p_trntype
AND doc_type = p_doctype
AND company = p_company
AND bedfn_id = p_bedfn_id
AND bectrn_id = v_bectrn_id
AND becat_id = v_becat_id
AND to_date(last_update_date) >=
CASE
WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
to_date(concat('01-OCT-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
to_date(concat('01-JAN-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
to_date(concat('01-APR-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
to_date(concat('01-JUL-', p_year - 1),'DD-MON-YYYY')
END
AND to_date(last_update_date) <
CASE
WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
to_date(concat('31-DEC-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
to_date(concat('31-MAR-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
to_date(concat('30-JUN-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
to_date(concat('30-SEP', p_year - 1),'DD-MON-YYYY')
END
GROUP BY bectrn_id, becat_id;
选择总和(转换值)总计、bectrn\u id、becat\u id
来自brvo_bemrc_交易
其中年份=p_年
和trn_类型=p_类型
和doc_type=p_doctype
AND company=p_company
和bedfn_id=p_bedfn_id
bectrn_id=v_bectrn_id
和becat_id=v_becat_id
截止日期(上次更新日期)>=
案例
当(1,2,3)中的(从SYSDATE开始的月份)提取时
截至日期(concat('01-10-',p_year-1),'DD-MON-YYYY')
当(从SYSDATE开始的月份)出现在(4,5,6)中时
截至日期(concat('01-JAN-',p_year-1),'DD-MON-YYYY')
当(从SYSDATE开始的月份)出现在(7,8,9)中时
截止日期(年月日,第一年四月一日)
当(从SYSDATE开始的月份)出现在(10,11,12)中时
截止日期(第一年7月1日、第一年1月1日、第二年1月1日)
结束
和截止日期(上次更新日期)<
案例
当(1,2,3)中的(从SYSDATE开始的月份)提取时
截至日期(concat('31-DEC-',p_year-1),'DD-MON-YYYY')
当(从SYSDATE开始的月份)出现在(4,5,6)中时
截至日期(concat('3月31日-',p_年份-1),'DD-MON-YYYY')
当(从SYSDATE开始的月份)出现在(7,8,9)中时
截至日期(第一年6月30日、第二个月1日、第二个月1日)
当(从SYSDATE开始的月份)出现在(10,11,12)中时
截止日期(第一年9月30日)和年月日
结束
按bectrn_id、becat_id分组;
您的查询失败,因为您的大小写
表达式产生一个布尔值,但Oracle的SQL没有布尔类型
当我们想要创建布尔表达式时,我们使用一个大小写表达式。这通常用于SELECT
子句中。WHERE
子句已经是一个布尔表达式,它足以使用和
、或
和括号来表达我们的目标。在您的情况下,您甚至可以使用模运算从当前季度到您感兴趣的季度
SELECT SUM(trans_value) total, bectrn_id, becat_id
FROM brvo_bemrc_transactions
WHERE year = p_year
AND trn_type = p_trntype
AND doc_type = p_doctype
AND company = p_company
AND bedfn_id = p_bedfn_id
AND bectrn_id = v_bectrn_id
AND becat_id = v_becat_id
AND extract(year from last_update_date) = p_year - 1
AND mod(to_number(to_char(last_update_date, 'q')), 4) + 1 = to_number(to_char(sysdate, 'q'))
GROUP BY bectrn_id, becat_id
ORDER BY bectrn_id, becat_id;
如果使用TRUNC(SYSDATE,'Q')
和/或TRUNC(last\u update\u date,'Q')
,查询可能会更容易。也可能对您有所帮助。谢谢@Wernfried Domscheit..将我的查询修改为\u日期(concat('01-OCT-',p\u year-1))
仅在某些设置下才有意义。您依靠DBMS猜测您使用的是英文月份缩写,前两位代表日期,后四位代表年份,日期部分可以用破折号分隔。不要让DBMS猜测。不要依赖可能匹配或不匹配的设置。告诉DBMS您使用的格式:to_date(concat('01-OCT-',p_year-1),'dd MON yyyy','NLS_date\u LANGUAGE=English')
。至于您的CASE WHEN
表达式:CASE WHEN
必须产生一个值。不幸的是,由于Oracle SQL没有布尔类型,to_date(last_update_date)>=to_date(concat('01-OCT-',p_year-1))和to_date(last_update_date)),在to_date(last_update_date)
中的日期(上一次更新_date
)上使用to_date似乎很奇怪。这是怎么回事?last\u update\u date
不是日期而是字符串吗?如果是这样:在数据库中以字符串形式存储日期是个坏主意。无论何时你想将字符串转换为日期,请指定转换所用的格式。谢谢@Tejash…实际上在我的Then语句中,我需要检查last_update_date range Inside,然后我需要为每种情况设置不同的范围是的,它也在这样做。在where语句中,您需要使用case。如果错误,请更正我。。在您的编辑中,我们在when条款中加入了日期和截止日期(上次更新日期)介于截止日期(第一年10月1日)和截止日期(第一年12月31日)之间。。然而,这应该是结果,而不是条件。我们可以那样投入吗。如果条件满足,它将产生结果为1,并且它再次与1进行比较,因此它将是相反的结果。
SELECT SUM(trans_value) total, bectrn_id, becat_id
FROM brvo_bemrc_transactions
WHERE year = p_year
AND trn_type = p_trntype
AND doc_type = p_doctype
AND company = p_company
AND bedfn_id = p_bedfn_id
AND bectrn_id = v_bectrn_id
AND becat_id = v_becat_id
AND to_date(last_update_date) >=
CASE
WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
to_date(concat('01-OCT-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
to_date(concat('01-JAN-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
to_date(concat('01-APR-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
to_date(concat('01-JUL-', p_year - 1),'DD-MON-YYYY')
END
AND to_date(last_update_date) <
CASE
WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
to_date(concat('31-DEC-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
to_date(concat('31-MAR-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
to_date(concat('30-JUN-', p_year - 1),'DD-MON-YYYY')
WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
to_date(concat('30-SEP', p_year - 1),'DD-MON-YYYY')
END
GROUP BY bectrn_id, becat_id;
SELECT SUM(trans_value) total, bectrn_id, becat_id
FROM brvo_bemrc_transactions
WHERE year = p_year
AND trn_type = p_trntype
AND doc_type = p_doctype
AND company = p_company
AND bedfn_id = p_bedfn_id
AND bectrn_id = v_bectrn_id
AND becat_id = v_becat_id
AND extract(year from last_update_date) = p_year - 1
AND mod(to_number(to_char(last_update_date, 'q')), 4) + 1 = to_number(to_char(sysdate, 'q'))
GROUP BY bectrn_id, becat_id
ORDER BY bectrn_id, becat_id;