SQL问题:mysql查询指定时间段内请假的天数(除去非工作日)

wyh906802129 2017-08-16 11:52:50

CREATE TABLE `wo_leave_request` (
`id` varchar(32) NOT NULL,
`create_time` datetime DEFAULT NULL,
`total_day` decimal(19,2) DEFAULT NULL COMMENT '请假天数',
`starttime` datetime DEFAULT NULL COMMENT '请假起始日期',
`type_name` varchar(255) DEFAULT NULL COMMENT '请假类型',
`userid` varchar(255) DEFAULT NULL COMMENT '人员ID',
`endtime` datetime DEFAULT NULL COMMENT '请假结束日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `wo_leave_request`
VALUES
(
'张三',
'2017-07-05',
'2017-07-09'
),
(
'张三',
'2017-06-05',
'2017-07-03'
),
(
'张三',
'2017-07-19',
'2017-07-22'
),
(
'王五',
'2017-07-18',
'2017-08-02'
);


CREATE TABLE `attendance_workday` (
`id` varchar(64) NOT NULL,
`iswork` int(11) DEFAULT NULL COMMENT '是否工作标识,0代表非工作日,1代表工作日',
`date` date DEFAULT NULL COMMENT '具体日期',
`week` int(11) DEFAULT NULL COMMENT '星期几的标识,分别有1/2/3/4/5/6/0,代表周一到周日',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考勤后台系统的工作日信息表';
这个表存了是否工作日的信息
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c40097', '1', '2017-06-01', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c40098', '1', '2017-06-02', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c40099', '0', '2017-06-03', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c4009a', '0', '2017-06-04', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c5009b', '1', '2017-06-05', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c5009c', '1', '2017-06-06', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c5009d', '1', '2017-06-07', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c5009e', '1', '2017-06-08', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c5009f', '1', '2017-06-09', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c500a0', '0', '2017-06-10', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c500a1', '0', '2017-06-11', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c500a2', '1', '2017-06-12', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c500a3', '1', '2017-06-13', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600a4', '1', '2017-06-14', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600a5', '1', '2017-06-15', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600a6', '1', '2017-06-16', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600a7', '0', '2017-06-17', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600a8', '0', '2017-06-18', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600a9', '1', '2017-06-19', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600aa', '1', '2017-06-20', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600ab', '1', '2017-06-21', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c600ac', '1', '2017-06-22', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700ad', '1', '2017-06-23', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700ae', '0', '2017-06-24', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700af', '0', '2017-06-25', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700b0', '1', '2017-06-26', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700b1', '1', '2017-06-27', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700b2', '1', '2017-06-28', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700b3', '1', '2017-06-29', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c700b4', '1', '2017-06-30', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800b5', '0', '2017-07-01', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800b6', '0', '2017-07-02', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800b7', '1', '2017-07-03', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800b8', '1', '2017-07-04', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800b9', '1', '2017-07-05', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800ba', '1', '2017-07-06', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800bb', '1', '2017-07-07', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800bc', '0', '2017-07-08', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c800bd', '0', '2017-07-09', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900be', '1', '2017-07-10', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900bf', '1', '2017-07-11', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c0', '1', '2017-07-12', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c1', '1', '2017-07-13', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c2', '1', '2017-07-14', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c3', '0', '2017-07-15', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c4', '0', '2017-07-16', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c5', '1', '2017-07-17', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47c900c6', '1', '2017-07-18', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00c7', '1', '2017-07-19', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00c8', '1', '2017-07-20', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00c9', '1', '2017-07-21', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00ca', '0', '2017-07-22', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00cb', '0', '2017-07-23', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00cc', '1', '2017-07-24', '1');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00cd', '1', '2017-07-25', '2');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00ce', '1', '2017-07-26', '3');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47ca00cf', '1', '2017-07-27', '4');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47cb00d0', '1', '2017-07-28', '5');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47cb00d1', '0', '2017-07-29', '6');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47cb00d2', '0', '2017-07-30', '0');
INSERT INTO `attendance_workday` VALUES ('ff8080815de0c938015de0ca47cb00d3', '1', '2017-07-31', '1');





指定时间例如 2017-07-01 ~ 2017-07-20 这段时间内每个人的请假天数(除了非工作日)

结果像 张三 6天
王五 1天
...全文
911 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaobokuce 2017-08-18
  • 打赏
  • 举报
回复
东西很好很给力哦!
繁花尽流年 2017-08-17
  • 打赏
  • 举报
回复
引用 9 楼 wyh906802129 的回复:
[quote=引用 8 楼 zengertao 的回复:] [quote=引用 7 楼 wyh906802129 的回复:] [quote=引用 6 楼 zengertao 的回复:] [quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。 [/quote] SELECT userid , COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CONVERT(VARCHAR(10),starttime,120) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CONVERT(VARCHAR(10),endtime,120) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是不行 date_format也不行[/quote] 看错了你是mysql啊,试试CAST(DATE_FORMAT(now(),'%Y-%m-%d') AS CHAR(10)) [/quote] SELECT userid, COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CAST(DATE_FORMAT(starttime,'%Y-%m-%d') AS CHAR(10)) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CAST(DATE_FORMAT(endtime,'%Y-%m-%d') AS CHAR(10)) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是一样 张三 4 王五 2[/quote]
  SELECT a.userid,COUNT(*) AS [days]
  FROM wo_leave_request a
  LEFT JOIN (
  					SELECT [date] 
  					FROM attendance_workday 
  					WHERE iswork=1
			) b ON	CONVERT(CHAR(10),b.[date],120) BETWEEN CONVERT(CHAR(10),starttime,120) AND CONVERT(CHAR(10),endtime,120)
					AND CONVERT(CHAR(10),b.[date],120) BETWEEN '2017-07-01' AND CONVERT(CHAR(10),'2017-07-20',120)
  GROUP BY a.userid
SQL模拟了下,没问题啊,6,3
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] 有测试数据吗?我帮你看看[/quote] INSERT INTO `wo_leave_request` VALUES ('张三', '2017-07-05 10:22:15', '2017-07-09 20:12:15'); INSERT INTO `wo_leave_request` VALUES ('张三', '2017-06-05 10:00:05', '2017-07-03 06:10:00'); INSERT INTO `wo_leave_request` VALUES ('张三', '2017-07-19 06:15:10', '2017-07-22 20:16:04'); INSERT INTO `wo_leave_request` VALUES ('王五', '2017-07-18 09:52:00', '2017-08-02 20:13:06');
二月十六 2017-08-17
  • 打赏
  • 举报
回复
引用 4 楼 wyh906802129 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] 有测试数据吗?我帮你看看
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
引用 8 楼 zengertao 的回复:
[quote=引用 7 楼 wyh906802129 的回复:] [quote=引用 6 楼 zengertao 的回复:] [quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。 [/quote] SELECT userid , COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CONVERT(VARCHAR(10),starttime,120) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CONVERT(VARCHAR(10),endtime,120) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是不行 date_format也不行[/quote] 看错了你是mysql啊,试试CAST(DATE_FORMAT(now(),'%Y-%m-%d') AS CHAR(10)) [/quote] SELECT userid, COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CAST(DATE_FORMAT(starttime,'%Y-%m-%d') AS CHAR(10)) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CAST(DATE_FORMAT(endtime,'%Y-%m-%d') AS CHAR(10)) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是一样 张三 4 王五 2
繁花尽流年 2017-08-17
  • 打赏
  • 举报
回复
引用 7 楼 wyh906802129 的回复:
[quote=引用 6 楼 zengertao 的回复:] [quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。 [/quote] SELECT userid , COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CONVERT(VARCHAR(10),starttime,120) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CONVERT(VARCHAR(10),endtime,120) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是不行 date_format也不行[/quote] 看错了你是mysql啊,试试CAST(DATE_FORMAT(now(),'%Y-%m-%d') AS CHAR(10))
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
引用 6 楼 zengertao 的回复:
[quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。 [/quote] SELECT userid , COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CONVERT(VARCHAR(10),starttime,120) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CONVERT(VARCHAR(10),endtime,120) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是不行 date_format也不行
繁花尽流年 2017-08-17
  • 打赏
  • 举报
回复
引用 4 楼 wyh906802129 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。
二月十六 2017-08-17
  • 打赏
  • 举报
回复
引用 4 楼 wyh906802129 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] 是因为时间吧,2017-07-01 是0点0分,加上时间后就不是以前那个时间 了
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
算,我计算错误了。。。哈哈
繁花尽流年 2017-08-17
  • 打赏
  • 举报
回复
引用 14 楼 wyh906802129 的回复:
[quote=引用 12 楼 zengertao 的回复:] [quote=引用 9 楼 wyh906802129 的回复:] [quote=引用 8 楼 zengertao 的回复:] [quote=引用 7 楼 wyh906802129 的回复:] [quote=引用 6 楼 zengertao 的回复:] [quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。 [/quote] SELECT userid , COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CONVERT(VARCHAR(10),starttime,120) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CONVERT(VARCHAR(10),endtime,120) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是不行 date_format也不行[/quote] 看错了你是mysql啊,试试CAST(DATE_FORMAT(now(),'%Y-%m-%d') AS CHAR(10)) [/quote] SELECT userid, COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CAST(DATE_FORMAT(starttime,'%Y-%m-%d') AS CHAR(10)) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CAST(DATE_FORMAT(endtime,'%Y-%m-%d') AS CHAR(10)) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是一样 张三 4 王五 2[/quote]
  SELECT a.userid,COUNT(*) AS [days]
  FROM wo_leave_request a
  LEFT JOIN (
  					SELECT [date] 
  					FROM attendance_workday 
  					WHERE iswork=1
			) b ON	CONVERT(CHAR(10),b.[date],120) BETWEEN CONVERT(CHAR(10),starttime,120) AND CONVERT(CHAR(10),endtime,120)
					AND CONVERT(CHAR(10),b.[date],120) BETWEEN '2017-07-01' AND CONVERT(CHAR(10),'2017-07-20',120)
  GROUP BY a.userid
SQL模拟了下,没问题啊,6,3[/quote] 我的mysql用不了convert函数[/quote] 换汤不换药自己换成DATE_FORMAT啊
二月十六 2017-08-17
  • 打赏
  • 举报
回复
引用 15 楼 wyh906802129 的回复:
[quote=引用 13 楼 sinat_28984567 的回复:]
SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN  DATE_FORMAT(starttime,'%Y-%m-%d') > '2017-07-01'
                                                              THEN  DATE_FORMAT(starttime,'%Y-%m-%d')
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN  DATE_FORMAT(endtime,'%Y-%m-%d') < '2017-07-20'
                                                              THEN DATE_FORMAT(endtime,'%Y-%m-%d')
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
这可以了,谢谢大神,麻烦您了。。。。[/quote] 不客气,记得结贴哦
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
引用 13 楼 sinat_28984567 的回复:
SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN  DATE_FORMAT(starttime,'%Y-%m-%d') > '2017-07-01'
                                                              THEN  DATE_FORMAT(starttime,'%Y-%m-%d')
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN  DATE_FORMAT(endtime,'%Y-%m-%d') < '2017-07-20'
                                                              THEN DATE_FORMAT(endtime,'%Y-%m-%d')
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
这可以了,谢谢大神,麻烦您了。。。。
wyh906802129 2017-08-17
  • 打赏
  • 举报
回复
引用 12 楼 zengertao 的回复:
[quote=引用 9 楼 wyh906802129 的回复:] [quote=引用 8 楼 zengertao 的回复:] [quote=引用 7 楼 wyh906802129 的回复:] [quote=引用 6 楼 zengertao 的回复:] [quote=引用 4 楼 wyh906802129 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
  SELECT    userid ,
            COUNT(1) AS days
  FROM      wo_leave_request
            JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
                                                              WHEN starttime > '2017-07-01'
                                                              THEN starttime
                                                              ELSE '2017-07-01'
                                                              END )
                                                              AND
                                                              ( CASE
                                                              WHEN endtime < '2017-07-20'
                                                              THEN endtime
                                                              ELSE '2017-07-20'
                                                              END )
  WHERE     attendance_workday.iswork = 1
  GROUP BY  userid
为什么时间该成这样,结果就变了呢 张三 2017-07-05 10:00:00 2017-07-09 20:00:00 张三 2017-06-05 10:00:00 2017-07-03 06:00:00 张三 2017-07-19 06:00:00 2017-07-22 20:00:00 王五 2017-07-18 09:00:00 2017-08-02 20:00:00 变成 张三 4 王五 2 了,这什么原因啊,时间格式问题吗,还是什么问题[/quote] datetime型数据使用时最好用convert转换成和你比较值一致的数据格式。 [/quote] SELECT userid , COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CONVERT(VARCHAR(10),starttime,120) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CONVERT(VARCHAR(10),endtime,120) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是不行 date_format也不行[/quote] 看错了你是mysql啊,试试CAST(DATE_FORMAT(now(),'%Y-%m-%d') AS CHAR(10)) [/quote] SELECT userid, COUNT(1) AS days FROM wo_leave_request JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE WHEN CAST(DATE_FORMAT(starttime,'%Y-%m-%d') AS CHAR(10)) > '2017-07-01' THEN starttime ELSE '2017-07-01' END ) AND ( CASE WHEN CAST(DATE_FORMAT(endtime,'%Y-%m-%d') AS CHAR(10)) < '2017-07-20' THEN endtime ELSE '2017-07-20' END ) WHERE attendance_workday.iswork = 1 GROUP BY userid 还是一样 张三 4 王五 2[/quote]
  SELECT a.userid,COUNT(*) AS [days]
  FROM wo_leave_request a
  LEFT JOIN (
  					SELECT [date] 
  					FROM attendance_workday 
  					WHERE iswork=1
			) b ON	CONVERT(CHAR(10),b.[date],120) BETWEEN CONVERT(CHAR(10),starttime,120) AND CONVERT(CHAR(10),endtime,120)
					AND CONVERT(CHAR(10),b.[date],120) BETWEEN '2017-07-01' AND CONVERT(CHAR(10),'2017-07-20',120)
  GROUP BY a.userid
SQL模拟了下,没问题啊,6,3[/quote] 我的mysql用不了convert函数
二月十六 2017-08-17
  • 打赏
  • 举报
回复
SELECT    userid ,
COUNT(1) AS days
FROM wo_leave_request
JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
WHEN DATE_FORMAT(starttime,'%Y-%m-%d') > '2017-07-01'
THEN DATE_FORMAT(starttime,'%Y-%m-%d')
ELSE '2017-07-01'
END )
AND
( CASE
WHEN DATE_FORMAT(endtime,'%Y-%m-%d') < '2017-07-20'
THEN DATE_FORMAT(endtime,'%Y-%m-%d')
ELSE '2017-07-20'
END )
WHERE attendance_workday.iswork = 1
GROUP BY userid


二月十六 2017-08-16
  • 打赏
  • 举报
回复
王五18,19,20这三天应该算请假吧
二月十六 2017-08-16
  • 打赏
  • 举报
回复
  SELECT    userid ,
COUNT(1) AS days
FROM wo_leave_request
JOIN attendance_workday ON attendance_workday.date BETWEEN ( CASE
WHEN starttime > '2017-07-01'
THEN starttime
ELSE '2017-07-01'
END )
AND
( CASE
WHEN endtime < '2017-07-20'
THEN endtime
ELSE '2017-07-20'
END )
WHERE attendance_workday.iswork = 1
GROUP BY userid
本课程是SQL系列课程第2篇:MySQL数据库。MySQL篇    MySQL数据库管理系统安装        10.1 MySQL概述            10.1.1 MySQL主要特点            10.1.2 MySQL主要版本         10.2 MySQL数据库安装和配置            10.2.1 Windows平台安装MySQL                1.下载MySQL8.0社区版                2.安装MySQL8.0社区版            10.2.2 Linux平台安装MySQL                1.更新软件仓库包索引                2.安装 MySQL                3.防火墙设置                4.启动 MySQL 服务                5.配置远程登录            10.2.3 macOS平台安装MySQL                1.下载MySQL8.0社区版                2.安装 MySQL    MySQL数据库管理系统日常管理        11.1 登录服务器        11.2 常见的管理命令            11.2.1 帮助命令            11.2.2 退出命令            11.2.3 数据库管理            11.2.4 用户管理        11.3 查看系统对象信息            11.3.1 查看有哪些库            11.3.2 查看有哪些表            11.3.3 查看表结构        11.4 执行脚本文件            11.4.1 不需要登录MySQL方式            11.4.2 需要登录MySQL方式        11.5 数据库备份与恢复            11.5.1 备份数据库            11.5.2 恢复数据库            11.5.3 实例:在Windows下备份到Linux下恢复        11.6 MySQL图形界面管理工具            11.6.1 下载和安装MySQL Workbench            11.6.2 配置连接数据库            11.6.3 管理数据库            11.6.4 管理表            11.6.5 执行SQL语句    MySQL中特有的SQL语句        12.1 自增长字段        12.2 MySQL日期相关数据类型        12.3 限制返回行数        12.4 常用函数            12.4.1 数字型函数            12.4.2 字符串函数            12.4.3 日期和时间函数    MySQL数据库开发        13.1 存储过程            13.1.1 使用存储过程重构“找出所有销售部所有员工信息”案例            13.1.2 调用存储过程            13.1.3 删除储过程        13.2 存储过程参数            13.2.1 IN参数            13.2.2 OUT参数            13.2.3 INOUT参数        13.3 存储函数            13.3.1 创建存储函数            13.3.2 调用存储函数            13.3.3 删除存储函数        13.4 触发器            13.4.1 触发器分类            13.4.2 创建触发器语法            13.4.3 使用NEW和OLD修饰符            13.4.4 示例:员工表操作更新日志            13.4.5 测试触发器

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧