Sql 计算从开始日期到结束日期或月末的天数
使用datediff,我可以计算两个日期之间的天数,但如何计算较晚日期或月末与开始日期之间的天数Sql 计算从开始日期到结束日期或月末的天数,sql,mariadb,Sql,Mariadb,使用datediff,我可以计算两个日期之间的天数,但如何计算较晚日期或月末与开始日期之间的天数 CREATE TABLE table1 (id int, start_date datetime, end_date datetime, jan int); INSERT INTO table1 (id, start_date, end_date) VALUES (1, '2016-12-12', '2017-01-17'), (2, '2017-01-10', '2017-01-10'),
CREATE TABLE table1 (id int, start_date datetime, end_date datetime, jan int);
INSERT INTO table1 (id, start_date, end_date) VALUES
(1, '2016-12-12', '2017-01-17'),
(2, '2017-01-10', '2017-01-10'),
(3, '2017-01-10', '2017-02-10'),
(4, '2017-01-03', '2017-02-03'),
(5, '2016-12-03', '2017-02-03');
如果我跑步:
select id, month(start_date) as month, datediff(end_date, start_date) as diff
from table1;
它回来了
id month diff
1 12 36
2 1 0
3 1 31
4 1 31
5 12 62
但我希望它能回来:
id month diff
1 12 19
5 12 28
1 1 17
2 1 0
3 1 21
4 1 28
5 1 31
3 2 10
4 2 3
5 2 3
我试图得到一个月内发生事件的天数
我创建了一个单独的查询,用这些值更新一个新列,但理想情况下它不应该有一个新列,因为我需要为每个年-月组合创建几个新列,为每个年-月组合创建一个新列:
update table1 set jan= case
when start_date >= "2017-01-01" and end_date <= last_day("2017-01-01") then datediff(end_date, start_date)+1
when start_date >= "2017-01-01" and start_date <= last_day("2017-01-01") and end_date > last_day("2017-01-01") then datediff(last_day("2017-01-01"), start_date)+1
when start_date < "2017-01-01" and end_date between "2017-01-01" and last_day("2017-01-01") then datediff(end_date, "2017-01-01")+1
when start_date < "2017-01-01" and end_date > last_day("2017-01-01") then day(last_day("2017-01-01"))
else null
end;
我不知道这是不是你要找的
select month(start_date) as month,
datediff(LAST_DAY(start_date), start_date) as diff
from table1
UNION ALL
select month(end_date) as month,
IF(end_date < LAST_DAY(start_date), datediff(start_date, end_date),
datediff(end_date, LAST_DAY(start_date)))
from table1;
我不知道这是否是你要找的
select month(start_date) as month,
datediff(LAST_DAY(start_date), start_date) as diff
from table1
UNION ALL
select month(end_date) as month,
IF(end_date < LAST_DAY(start_date), datediff(start_date, end_date),
datediff(end_date, LAST_DAY(start_date)))
from table1;
您的问题将是获取多行。。。所以让我们采取不同的方法。< /P> 如果您有一个日历表,那么这就很简单了:一个每个日期有一行的表,以及一组单独的列和索引:
SELECT Table1.id, Calendar.calendar_month, COUNT(*)
FROM Table1
JOIN Calendar
ON Calendar.calendar_date >= start_date
AND Calendar.calendar_date < end_date
GROUP BY Table1.id, Calendar.calendar_month
ORDER BY Table1.id, MIN(Calendar.calendar_date)
您的问题将是获取多行。。。所以让我们采取不同的方法。< /P> 如果您有一个日历表,那么这就很简单了:一个每个日期有一行的表,以及一组单独的列和索引:
SELECT Table1.id, Calendar.calendar_month, COUNT(*)
FROM Table1
JOIN Calendar
ON Calendar.calendar_date >= start_date
AND Calendar.calendar_date < end_date
GROUP BY Table1.id, Calendar.calendar_month
ORDER BY Table1.id, MIN(Calendar.calendar_date)
接近,但万一第一次事件发生在2个月前?与id 5 2017-12-03和2017-02-03一样,两个月的间隔不超过两个月。你是说2016-12-03和2017-02-03?是的,对不起。我想考虑事件发生在第12个月,到明年第2个月或第3个月结束。请查看最新的查询,以准确了解我要查找的内容,无新列。可能我的问题需要一个子查询。建议删除此答案,因为它不能处理>2个月。接近,但如果第一个事件发生在2个月之前?与id 5 2017-12-03和2017-02-03一样,两个月的间隔不超过两个月。你是说2016-12-03和2017-02-03?是的,对不起。我想考虑事件发生在第12个月,到明年第2个月或第3个月结束。请查看最新的查询,以准确了解我要查找的内容,无新列。我的问题可能需要一个子查询。建议删除此答案,因为它不能处理>2个月的时间。更新无效,您需要更多行。有5个源行和10个输出行,其中5个被提到了3次。即每个输入的行数为variable@RickJames当然我在DDL示例中使用了它。请参阅id 5。更新无效,您需要更多行。有5个源行和10个输出行,其中5个被提到了3次。即每个输入的行数为variable@RickJames当然我在DDL示例中使用了它。请参阅id 5。MariaDB的序列表可以动态创建这样的日历。对于onsie twosie查询,当然可以。但是一个永久的日历表是一件美好的事情,特别是因为它可以容纳不容易从严格的顺序生成的内容;节假日、会计年度和期间,尤其是使用52/53周日历时,如零售业。特别是如果结果序列很大,索引会有所帮助。如果不查看该功能,我不知道该功能是否在这里工作,或者是否会为每个分组生成一个表,或者是什么。MariaDB的序列表可以动态创建这样的日历。对于onsie twosie查询,当然可以。但是一个永久的日历表是一件美好的事情,特别是因为它可以容纳不容易从严格的顺序生成的内容;节假日、会计年度和期间,尤其是使用52/53周日历时,如零售业。特别是如果结果序列很大,索引会有所帮助。不看这个特性,我不知道这个特性在这里是否有效,或者是否会为每个分组生成一个表,或者是什么。