查询某天是当年第几个星期的函数
to_char(date,'iw')
iw的算法为星期一至星期日算一周,且每年的第一个星期一为第一周,
例如:20050101为星期六,所以用iw的算法是前年的53周,而20050103之后才是第一周的开始。
还有ww,应该用的较少
ww的算法为每年1月1日为第一周开始,date+6为每一周结尾
例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107
特殊情况
如果要查询'yyyy-iw'形式的年-周,一年中最后几天和前几天的可能会出错,跨年那一周,哪年占的天数多,该周就算在哪一年,也就是有可能算在去年最后一周,也可能算在当年第一周
比如
select to_char(to_date('2018-12-31','yyyy-mm-dd'),'yyyy-iw') from dual;
结果为2018-01,因为12-31号算在2019 年第一周,而截取年份是2018
解决办法:哪年占的天数多,该周就算在哪一年,可以推断出周四那天是决定性的一天。如果周四是去年的,那么该周就是去年最后一周,如果周四是今年的,那么该周就是今年第一周
查询语句:查出周四对应的年份,与周数进行拼接
SELECT
to_char( next_day( trunc( to_date( '2018-12-31', 'yyyy-mm-dd' ), 'iw' ), '星期四' ), 'yyyy' ) || '-' || to_char( to_date( '2018-12-31', 'yyyy-mm-dd' ), 'iw' )
FROM
多个字段去重
distinct 字段1,字段2
表示选取多个字段拼接的一条记录,不重复的所有记录,如distinct year, month
分组和去重
分组后查询字段数量count(),是该小组内的数量
查询字段为某值的数量 count(decode(字段名,值名,1))。如果分组过,则查询的是该小组内的数量
如:count(decode(name,'张三',1))
分周和日进行查询所需的数据
上面已经说了如何查询当前日期所在周数,那么在帆软里面创建图表,想要通过日和周进行查询,该如何查询出需要的数据呢?
解决办法:查询两个表,一个表中字段是正常的日期,一个表中将日期替换为周数,通过union all 进行连接,并为表分别设置字段flag,值为day和week,以便在finereport里进行区分
finereport帆软控件设置
在帆软数据库查询里面添加参数进行查询条件限制
将上述联立的表当做整体,添加数据集查询条件:
where 1=1 ${if (len(flag==0),"","and flag in('"+flag+"')")}
通过参数flag选择日或者周查询
flag控件选择单选控件,控件值选择自定义,设置day和week
where 1=1 表示条件永真,防止没有之后的参数条件时,where 多出而导致出错;len(area)==0 表示参数 area 为空;"and 货主地区='"+area+"'" 中间的 area 表示取参数值,'+' 为字符串拼接符号。
分别在两个表中添加时间限制条件:
where to_char(date,'yyyy-mm-dd') between '${s_date}' and '${e_date}'
通过参数s_date 和e_date 设置控件选择开始日期和结束日期
预览时后面是空白内容
预览报表时发现后面一半内容是空白页。
解决办法:在设计界面,表格的下方选中部分重新清除表格内容,
产生原因:这可能是之前设计表的时候,下面的内容没有清理干净,因为之前我是从第二行开始设计表,后面剪切到了第一行,可能留下了表格格式。
insert模式
在写代码时遇到光标后边的字被我输入的字逐个替代的问题,询问朋友后才知道是不小心切换到了覆盖模式,笔者还是第一次遇到这个问题
点击键盘的insert即可切换到插入模式
选择文本框时,自动删除粘贴内容首尾空格
SELECT * FROM 订单
where 1=1
${if(len(订单ID)==0,"","and 订单ID LIKE '%"+ trim(订单ID)+ "%'")}
${if(len(货主地址)==0,"","and 货主地址 LIKE '%"+ trim(货主地址)+ "%'")}
like 模糊匹配
trim() 函数用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等