Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算从开始日期到结束日期或月末的天数_Sql_Mariadb - Fatal编程技术网

Sql 计算从开始日期到结束日期或月末的天数

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'),

使用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'), 
(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周日历时,如零售业。特别是如果结果序列很大,索引会有所帮助。不看这个特性,我不知道这个特性在这里是否有效,或者是否会为每个分组生成一个表,或者是什么。