1.需求是从衍生层的数据库日历表中查询出
指定月的第几周的周几
一开始的sql是这样的 1
SELECT * FROM (SELECT A.*,ROW_NUMBER() OVER(partition by A.year,A.month order by A.caledrDate ASC) bondAdjustWeekFROM (SELECT TO_CHAR(CALENDR_DATE, 'yyyyMMdd') as caledrDate,WORK_DAY_FLAG AS workDayFlag,to_char(CALENDR_DATE,'YY') AS year,to_char(CALENDR_DATE,'MM') as month,to_char(CALENDR_DATE,'day') as weekDay,rank() over (partition by SUBSTR(REC_ID_SRC,0,6),TRUNC(VM.CALEDR_DATE,'DDD') ORDER BY VM.CALEDR_DATE ASC) RNFROM CM_CALND_PAR VMWHERE VM.DEL_FLAG = '01'AND to_char(CALENDR_DATE,'YYYY-MM-DD'')>= '2021-07-01'AND to_char(CALENDR_DATE,'YYYY-MM-DD'')<= '2026-07-01'AND SUBSTR(REC_IN_IN_SRC,0,6) = 'NADAYS' WHERE RN =1 AND A.month IN ('01','03') AND A.weekDay = '星期二' ORDER BY caledrDate asc)X WHERE X.bondAdjustWeek = '1'
12345678910111213141516171819值得注意的是,这里的weekDay我是用的中文字符进行匹配的,
因为当时使用oracle中的tochar函数转换日期,day可以直接看出是中文的周几,Oracle的TO_CHAR函数的format针对时间的转换格式
只注意了to_char(CALENDR_DATE,‘day’),
其实使用**to_char(CALENDR_DATE,‘d’)**更好,可以直接转换成数字,用数字进行匹配,这也是后来的sql写法
后来代码提交上线后,发现根本查询不到任何日期!!!!
1.确认了jekins的发版的分支,以及对应的分支的服务器
2.确认了前端的接口,及对应的接口参数
3.确认对应的接口参数传到本地的后端居然能查询出结果!!!
4.确认对应服务器(有两台服务器都看了)的日志,可惜使用的日志级别仅仅到info,没有异常!
请大佬帮忙改日志级别为debug
使用tail -f100 日志文件名.out |grep 关键接口
发现执行了查询sql,但是查询的结果就是0!!!
最后在大佬们的帮助下,找到了是中文字符的原因,把中文匹配改成数字匹配,问题到解决了!
最后改正过来的sql是这样的 1
SELECT * FROM (SELECT A.*,ROW_NUMBER() OVER(partition by A.year,A.month order by A.caledrDate ASC) bondAdjustWeekFROM (SELECT TO_CHAR(CALENDR_DATE, 'yyyyMMdd') as caledrDate,WORK_DAY_FLAG AS workDayFlag,to_char(CALENDR_DATE,'YY') AS year,to_char(CALENDR_DATE,'MM') as month,to_char(CALENDR_DATE,'day') as weekDay,rank() over (partition by SUBSTR(REC_ID_SRC,0,6),TRUNC(VM.CALEDR_DATE,'DDD') ORDER BY VM.CALEDR_DATE ASC) RNFROM CM_CALND_PAR VMWHERE VM.DEL_FLAG = '01'AND VM.CALENDR_DATE >= TO_DATE('2021-07-01','YYYY-MM-DD')//这里一开始也不是改后面传的参数TO_DATE,而是改字段,改成TO_DATE是对的。AND VM.CALENDR_DATE <= TO_DATE('2026-07-01','YYYY-MM-DD')AND WORK_DAY_CALENDR_TYPE_CODE = 'DATE0000025')A//这里一开始并不是这个字段,后来改成了索引字段 WHERE RN =1 AND A.month IN ('01','03') AND A.weekDay = 2//这里应该尽量用数字,而不是字符 ORDER BY caledrDate asc)X WHERE X.bondAdjustWeek = 1//这里也应该尽量使用数字
12345678910111213141516171819感谢观看!
点个赞再走呗~
相关知识
使用中文字符作为sql的传参,导致查询不出结果
全文搜索 (SQL Server)
模糊查询和转义字符.doc
SQL语言艺术
《sql 语言艺术》 概要
VSSADMIN命令无法列出SQL writer的问题
数据库与SQL语言
6 字符型数据及其处理
【蓝蓝高频面试之数据库系列】第一期数据库基础20题
第十击
网址: 使用中文字符作为sql的传参,导致查询不出结果 https://m.huajiangbk.com/newsview105105.html
上一篇: 《sql 语言艺术》 概要 |
下一篇: 什么是聚集索引,什么是非聚集索引 |