提问
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,极速登录

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

gavindexu 社区微信达人 渐入佳境(Lv2)
发表于 2019-1-16 11:19:29 | 显示全部楼层 |取消关注该作者的回复
首先,得创建一个中间表。
(创建中间表、取期间所有日期都是从琉璃岁月@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. 对应关系。
截图201901161109434401.png

然后拖入FR里,



把内置数据集weekday的ddd拖到B1的位置,weekday拖到B2的位置,都设置为横向扩展。
把ds1的rpt拖入A3,dd拖入B3,并设置B3的过滤条件,
使得它的weekday和内置数据集weekday的weekday相对应后,隐藏第2行,并冻结第1行。

截图201901161112387517.png

最后出来的结果就是
截图201901161117512027.png

# 写在后面
在ds1里,预留了dd2和md,分别为具体是几号和月份,
本来想尝试可以不同的月实现不同的背景色来着……
奈何技穷……

截图201901161110249684.png

评分

参与人数 1F豆 +100 收起 理由
七夜 + 100

查看全部评分

此帖共有 157 位番薯登录后查看

已有1人关注本帖

bry
回复

使用道具 举报

gavindexu 社区微信达人 渐入佳境(Lv2)
发表于 2019-1-16 11:21:21 | 显示全部楼层 |取消关注该作者的回复
微信截图_20190116112036.png
沙发自己坐,这是之前纯手工拉出来的样子……
提到的dd2和md就是为做成这个样式准备的……

  • 评论

回复 支持 反对

使用道具 举报

地铁 社区微信达人 渐入佳境(Lv2)
发表于 2019-1-16 18:54:00 | 显示全部楼层 |取消关注该作者的回复
好帖子,学习啦
  • 评论

回复 支持 反对

使用道具 举报

博哥 社区微信达人实名认证 渐入佳境(Lv2)
发表于 2019-1-16 19:36:19 | 显示全部楼层 |取消关注该作者的回复
学习了
  • 评论

回复 支持 反对

使用道具 举报

剧终 社区微信达人实名认证 番薯互助团队 互助砖家
发表于 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
复制代码
  • 评论

回复 支持 1 反对 0

使用道具 举报

剧终 社区微信达人实名认证 番薯互助团队 互助砖家
发表于 2019-1-17 10:49:16 | 显示全部楼层 |取消关注该作者的回复
这个直接年,季度,月,日,周,星期  都出来了
  • 评论

回复 支持 反对

使用道具 举报

gavindexu 社区微信达人 渐入佳境(Lv2)
发表于 2019-1-17 14:05:52 | 显示全部楼层 |取消关注该作者的回复
剧终 发表于 2019-1-17 10:49
这个直接年,季度,月,日,周,星期  都出来了

简直方便,直接省去了中间表!
感谢大神的存储过程。
  • 评论

回复 支持 反对

使用道具 举报

剧终 社区微信达人实名认证 番薯互助团队 互助砖家
发表于 2019-1-17 14:08:52 | 显示全部楼层 |取消关注该作者的回复
gavindexu 发表于 2019-1-17 14:05
简直方便,直接省去了中间表!
感谢大神的存储过程。

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

  • 评论

回复 支持 反对

使用道具 举报

gavindexu 社区微信达人 渐入佳境(Lv2)
发表于 2019-1-17 14:12:25 | 显示全部楼层 |取消关注该作者的回复
剧终 发表于 2019-1-17 14:08
你可以把日期改为这个
然后YYYY 输入参数就可以得到你要的年份的日历了
还有就是我的这个是从周一开 ...

我试试看拼一下它们~~~
  • 评论

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

联系管理员@饭团君|联系帆软|免责声明|手机版|帆软社区|Copyright © 帆软软件有限公司 ( 苏ICP备14031611号-3 )

GMT+8, 2019-8-26 13:09 , Processed in 0.685222 second(s), 117 queries , Gzip On.

返回顶部 返回列表