- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 previous question 中关于“在正常表格中连续计算 N 天”,我在下面得到了这个答案,效果很好。我意识到我需要跳过计算周末,例如:如果用户在周五和下周一有 session ,那么这应该算作连续 2 天,而不是因为周末而中断。
这是解释我现在拥有的代码。
DROP TABLE IF EXISTS meetings;
CREATE TABLE IF NOT EXISTS meetings
( meeting_id int(10) unsigned NOT NULL AUTO_INCREMENT
, meeting_time datetime NOT NULL
, PRIMARY KEY (meeting_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS meetings_users;
CREATE TABLE IF NOT EXISTS meetings_users
( user_id int(10) unsigned NOT NULL
, meeting_id int(10) unsigned NOT NULL
, PRIMARY KEY (meeting_id,user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS users;
CREATE TABLE IF NOT EXISTS users
( user_id int(10) unsigned NOT NULL AUTO_INCREMENT
, PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO users ( user_id ) VALUES (1),(2),(3),(4);
INSERT INTO meetings ( meeting_id, meeting_time ) VALUES
(1, '2013-01-14 10:00:00'),
(2, '2013-01-15 10:00:00'),
(3, '2013-01-16 10:00:00'),
(4, '2013-01-17 10:00:00'),
(5, '2013-01-18 10:00:00'),
(6, '2013-01-19 10:00:00'),
(7, '2013-01-20 10:00:00'),
(8, '2013-01-11 10:00:00');
INSERT INTO meetings_users (meeting_id, user_id ) VALUES
(1, 1),
(2, 1),
(2, 3),
(3, 1),
(3, 3),
(4, 2),
(4, 3),
(5, 2),
(6, 1),
(8, 1);
SET @dt = '2013-01-15';
SELECT user_id
, start
, DATEDIFF(@dt,start)+1 cons
FROM
(
SELECT a.user_id
, a.meeting_date Start
, MIN(c.meeting_date) End
, DATEDIFF(MIN(c.meeting_date),a.meeting_date) + 1 diff
FROM (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) a
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) b
ON b.user_id = a.user_id
AND a.meeting_date = b.meeting_date + INTERVAL 1 DAY
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) c
ON c.user_id = a.user_id
AND a.meeting_date <= c.meeting_date
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) d
ON d.user_id = a.user_id
AND c.meeting_date = d.meeting_date - INTERVAL 1 DAY
WHERE b.meeting_date IS NULL
AND c.meeting_date IS NOT NULL
AND d.meeting_date IS NULL
GROUP
BY a.user_id
, a.meeting_date
) x
WHERE @dt BETWEEN start AND end;
+---------+------------+------+
| user_id | start | cons |
+---------+------------+------+
| 1 | 2013-01-14 | 2 |
| 3 | 2013-01-15 | 1 |
+---------+------------+------+
我尝试创建自己的函数来替换原来的 DATEDIFF,以便跳过基于 this 的周末答案(我将其命名为 CustomDateDiff)并且工作得很好,但我认为问题仍然存在于 a.meeting_date = b.meeting_date + INTERVAL 1 DAY
,我应该跳过 INTERVAL
我猜也是。
最佳答案
好的,从 here 中获取一些代码,我已经修改了我之前对@dt中因素的回应......
@dt = '2013-01-15';
SELECT *
, @dt target
, 5 * (DATEDIFF(@dt, start) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(start) + WEEKDAY(@dt) + 1, 1)+1 cons
FROM (
SELECT x.user_id
, MIN(x.start) start
, COALESCE(y.end,x.end) end
, MAX(COALESCE(y.diff,0)+x.diff) ttl
FROM
(
SELECT a.user_id
, a.meeting_date Start
, MIN(c.meeting_date) End
, DATEDIFF(MIN(c.meeting_date),a.meeting_date) + 1 diff
FROM (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) a
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) b
ON b.user_id = a.user_id
AND a.meeting_date = b.meeting_date + INTERVAL 1 DAY
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) c
ON c.user_id = a.user_id
AND a.meeting_date <= c.meeting_date
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) d
ON d.user_id = a.user_id
AND c.meeting_date = d.meeting_date - INTERVAL 1 DAY
WHERE b.meeting_date IS NULL
AND c.meeting_date IS NOT NULL
AND d.meeting_date IS NULL
GROUP
BY a.user_id
, a.meeting_date
)x
LEFT JOIN
(
SELECT a.user_id
, a.meeting_date Start
, MIN(c.meeting_date) End
, DATEDIFF(MIN(c.meeting_date),a.meeting_date) + 1 diff
FROM (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) a
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) b
ON b.user_id = a.user_id
AND a.meeting_date = b.meeting_date + INTERVAL 1 DAY
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) c
ON c.user_id = a.user_id
AND a.meeting_date <= c.meeting_date
LEFT
JOIN (SELECT DISTINCT mu.user_id,DATE(m.meeting_time) meeting_date FROM meetings_users mu JOIN meetings m ON m.meeting_id = mu.meeting_id) d
ON d.user_id = a.user_id
AND c.meeting_date = d.meeting_date - INTERVAL 1 DAY
WHERE b.meeting_date IS NULL
AND c.meeting_date IS NOT NULL
AND d.meeting_date IS NULL
GROUP
BY a.user_id
, a.meeting_date
)y
ON y.user_id = x.user_id
AND y.start = x.end+INTERVAL 3 DAY AND WEEKDAY(x.end) = 4
GROUP BY user_id,end
)j
WHERE @dt BETWEEN start AND end;
关于MySQL 在 datediff 中跳过周末,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14334119/
我想使用sql查询数据库以显示id 1,2,3等之间的时间差异。基本上它会比较其下面的行的所有记录。任何帮助,将不胜感激。 IDCODE DATE TIME DIFFERENCE (M
SQL服务器: DECLARE @Date1 DATETIME SET @Date1 = '2012-26-12 12:00:05 AM' DECLARE @Date2 DATETIME SET @D
SQL服务器: DECLARE @Date1 DATETIME SET @Date1 = '2012-26-12 12:00:05 AM' DECLARE @Date2 DATETIME SET @D
我正在尝试执行我认为是简单的日期差异函数的操作,但是由于某种原因,我的单位值被读取为列(“dd”),因此我一直在获取列,但无法解决错误 我正在使用AWS Athena 我的代码是这样 SELECT "
我有一个包含日期列(开始日期、结束日期)的表格,我想计算这些日期之间的差异并按月分组。 我可以在几天内得到 datediff,但我不知道如何在月内对它进行分组,有什么建议吗? Table: id
我在我的 mongoDB 中有一个集合,它存储提供给客户的服务以及他们的电子邮件地址,如下所示 { "_id" : ObjectId("56a84627f8fd4a136c0e944a"),
我们想计算两个 DateTimeOffset 之间的差异,但是,SQL 返回了错误的值,我们做错了什么? DECLARE @timeInZone1 AS DATETIMEOFFSET DECLARE
我需要计算两个日期之间的 DateDiff(小时),但仅限于工作时间(8:30 - 16:00,没有周末)。然后,按照下面的示例,此结果将放入 Reaction_Time 列中。 ID 日期 reac
我有一个名为 member 的 SQL 表,其中有成员信息以及他们的出生日期。 我需要列出所有 25 岁以上的人。现在,我得到了这个: SELECT * FROM members WHERE DATE
我在我们的旧代码中找到了一个地方,原来的程序员试图计算一个员工是否被雇用了一定年限。计算使用的是受雇日期与今天之间的天数差除以 364。这对我来说没有意义,所以我将其更改为年差。这似乎也给出了错误的答
我在这里在 CF 中解决了一个难题。 您有一个时间戳作为参数传递给服务器。例如 2012-5-10 14:55 . 如果从给定的时间过去了 30 秒,您将如何查看并返回 true或 false ? 规
我正在运行一个简单的 DATEDIFF 查询,但它似乎没有正确计算天数,或者我做错了什么。 如果我跑 PRINT DATEDIFF(Day, 2010-01-20, 2010-01-01) RETUR
我在将分钟转换为小数时遇到了一些问题,即使我已经查看了 SO 的其他回复。 select cast(datediff(minute, min(start_time), min(complete_tim
我需要从 SQL Server 数据库向下游传递一个值,这本质上是两个 时间戳 之间的差异。使用 DATEDIFF 函数就足够简单了。 SELECT DATEDIFF(day, '2015-11-06
有人知道为什么以下返回 8 吗?我预计 8 小时 30 分钟,还是 8.5? declare @start_day datetime; declare @end_day datetime; decla
我想获取相对于当前日期的上个月 SELECT datediff(mm,-1,2-2-2011) 此查询给出67,这是一个错误的值..我哪里出错了? 最佳答案 您可以使用DATEADD 例如。 SELE
我在使用 PHP DateDiff 时遇到问题,我不明白为什么每个时区返回不同的结果,例如在本例中布拉格返回 0 个月,而美国返回 1 个月。 这有什么区别以及我如何按预期返回 1 个月(而不是 30
我有一个名为 date1 的变量,其中包含使用 parseDateTime 生成的 ColdFusion 日期/时间对象。当我转储变量时,我得到 {ts '2014-12-20 15:46:57'}。
我有一个 Excel 文件,它会在添加条目时自动为其添加时间戳。我想要一个脚本来查找第一个条目和最后一个条目之间的时间差(以分钟为单位)。这是我到目前为止所想到的。 Sub Duration() Di
我正在使用 SQL Server我需要知道患者接受治疗的天数。问题是我只能得到 startDate 而不能得到 endDate当我运行查询并按 StartDate 排序时,我得到如下内容: Start
我是一名优秀的程序员,十分优秀!