分享一个制作 【周数日历表】的方法

楼主
我是社区第90669位番薯,欢迎点我头像关注我哦~
首先,得创建一个中间表。
(创建中间表、取期间所有日期都是从琉璃岁月@lupantao发表在CSDN上学习来的,https://blog.csdn.net/liupantao/article/details/79457431
因为ta原本创建的表名是num,我这边又在前面加了“week_”。
  1. CREATE TABLE week_num (i int);
  2. INSERT INTO week_num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
复制代码


然后借中间表去取一年所有的日期,并取出日期对应周的周六那一天的日期,命名为ds1。(在这里感谢@tinydata 提供的帮助

  1. SELECT
  2. ADDDATE('${set_date}', numlist.id) AS dd,
  3.         DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%d') AS dd2,
  4.         DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%m') AS md,
  5.         WEEKDAY(ADDDATE('${set_date}', numlist.id)) AS wk,
  6.         DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY) AS wk_end,
  7.         CONCAT(YEAR(DATE_SUB(SUBDATE(DATE(ADDDATE('${set_date}', numlist.id)), DATE_FORMAT(ADDDATE('${set_date}', numlist.id), '%w') -7), INTERVAL 1 DAY)),
  8.                         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,
  9.                         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)),
  10.                         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
  11. FROM (SELECT n1.i + n10.i * 10 + n100.i * 100 AS id
  12. FROM wab.week_num n1
  13. CROSS JOIN wab.week_num AS n10
  14. CROSS JOIN wab.week_num AS n100) AS numlist
  15. WHERE adddate('${set_date}', numlist.id) <= (SELECT concat(YEAR('${set_date}'),'-12-31'))
  16. ORDER BY ADDDATE('${set_date}', numlist.id);
复制代码


预览后,会出现一个添加控件的提示。
添加它,并设定为日期控件,控件值为公式,默认返回当前日期所属年份的第一天。
  1. DATEINYEAR(TODAY(),1)
复制代码


因为我们这边使用的习惯是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,分别为具体是几号和月份,
本来想尝试可以不同的月实现不同的背景色来着……
奈何技穷……

分享扩散:
参与人数 +1 F豆 +100 理由
七夜 + 100

查看全部评分

沙发
发表于 2019-1-16 11:21:21

沙发自己坐,这是之前纯手工拉出来的样子……
提到的dd2和md就是为做成这个样式准备的……

板凳
发表于 2019-1-16 18:54:00
好帖子,学习啦
地板
发表于 2019-1-16 19:36:19
学习了
5楼
发表于 2019-1-17 10:48:32
  1. BEGIN

  2. DECLARE num int DEFAULT -1;
  3. CREATE TEMPORARY TABLE under_日历 (
  4.       yyyy int,
  5.                         q int,
  6.       mm int,
  7.                         dd VARCHAR(15),
  8.                         w INT,
  9.                         wd VARCHAR(15)
  10.   );
  11.     lp:LOOP
  12.         set num = num+1;
  13.                                 insert into under_日历
  14. select year(CURDATE()) as y,
  15. floor((date_format(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY), INTERVAL num DAY),'%m')+2)/3) as q,
  16. date_format(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY), INTERVAL num DAY),'%m') as M,
  17. date_format(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY), INTERVAL num DAY),'%Y-%m-%d') as date,
  18. date_format(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY), INTERVAL num DAY),'%u') as W,
  19. case DAYOFWEEK(date_format(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY), INTERVAL num DAY),'%Y-%m-%d'))-1
  20. when 1 then '星期一'
  21. when 2 then '星期二'
  22. when 3 then '星期三'
  23. when 4 then '星期四'
  24. when 5 then '星期五'
  25. when 6 then '星期六'
  26. when 0 then '星期日'
  27. end as DW;
  28.   if num=dayofyear(concat(YEAR(now()),'-12-31'))-1 THEN LEAVE lp;
  29.         END if;
  30.     END LOOP;
  31. select * from under_日历;
  32. DROP TABLE under_日历;
  33. END
复制代码
6楼
发表于 2019-1-17 10:49:16
这个直接年,季度,月,日,周,星期  都出来了
7楼
发表于 2019-1-17 14:05:52
剧终 发表于 2019-1-17 10:49
这个直接年,季度,月,日,周,星期  都出来了

简直方便,直接省去了中间表!
感谢大神的存储过程。
8楼
发表于 2019-1-17 14:08:52
gavindexu 发表于 2019-1-17 14:05
简直方便,直接省去了中间表!
感谢大神的存储过程。


你可以把日期改为这个
然后YYYY 输入参数就可以得到你要的年份的日历了
还有就是我的这个是从周一开始算一周的,如果是从周日的话得把u改为大写的

9楼
发表于 2019-1-17 14:12:25
剧终 发表于 2019-1-17 14:08
你可以把日期改为这个
然后YYYY 输入参数就可以得到你要的年份的日历了
还有就是我的这个是从周一开 ...

我试试看拼一下它们~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

9回帖数 2关注人数 12610浏览人数
最后回复于:2020-11-12 09:03

返回顶部 返回列表