首先,得创建一个中间表。
(创建中间表、取期间所有日期都是从琉璃岁月@lupantao发表在CSDN上学习来的,https://blog.csdn.net/liupantao/article/details/79457431,
因为ta原本创建的表名是num,我这边又在前面加了“week_”。
- CREATE TABLE week_num (i int);
- INSERT INTO week_num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
复制代码
然后借中间表去取一年所有的日期,并取出日期对应周的周六那一天的日期,命名为ds1。(在这里感谢@tinydata 提供的帮助)
- SELECT
- ADDDATE('${set_date}', numlist.id) AS dd,
- DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%d') AS dd2,
- DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%m') AS md,
- WEEKDAY(ADDDATE('${set_date}', numlist.id)) AS wk,
- DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY) AS wk_end,
- CONCAT(YEAR(DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY)),
- IF(WEEK(DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY), 6) < 10,
- CONCAT(' Week 0',WEEK(DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY), 6)),
- CONCAT(' Week ',WEEK(DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY), 6)))) AS rpt
- FROM (SELECT n1.i + n10.i * 10 + n100.i * 100 AS id
- FROM wab.week_num n1
- CROSS JOIN wab.week_num AS n10
- CROSS JOIN wab.week_num AS n100) AS numlist
- WHERE adddate('${set_date}', numlist.id) <= (SELECT concat(YEAR('${set_date}'),'-12-31'))
- ORDER BY ADDDATE('${set_date}', numlist.id);
复制代码
预览后,会出现一个添加控件的提示。
添加它,并设定为日期控件,控件值为公式,默认返回当前日期所属年份的第一天。
因为我们这边使用的习惯是Mon.、Tue.这种,所以需要再新增一个内置数据集,我将它命名为weekday,
设置了对应的 WEEKDAY() 和 Mon. 对应关系。
然后拖入FR里,
把内置数据集weekday的ddd拖到B1的位置,weekday拖到B2的位置,都设置为横向扩展。
把ds1的rpt拖入A3,dd拖入B3,并设置B3的过滤条件,
使得它的weekday和内置数据集weekday的weekday相对应后,隐藏第2行,并冻结第1行。
最后出来的结果就是
# 写在后面
在ds1里,预留了dd2和md,分别为具体是几号和月份,
本来想尝试可以不同的月实现不同的背景色来着……
奈何技穷……
|