mysql 计算两个日期间有多少个2月29

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 计算两个日期间有多少个2月29相关的知识,希望对你有一定的参考价值。

参考技术A 功能:
统计两个日期间有多少个2月29
实现方法:
2月29天数 = 两个日期间天数 - (两个日期在非闰年的一个自然年内天数 + 365 * 两个日期年数差)

DELIMITER $$

DROP FUNCTION IF EXISTS `F_GET_LEAYYEAR_DAYS`$$

CREATE FUNCTION `F_GET_LEAYYEAR_DAYS`(start_date BIGINT, end_date BIGINT) RETURNS INT(11)
BEGIN
DECLARE v_day INT;
DECLARE v_year INT;
DECLARE v_base_day INT;
DECLARE v_leay_year_days INT;

DECLARE v_start_date DATETIME;
DECLARE v_end_date DATETIME;

SET v_start_date = start_date;
SET v_end_date = end_date;

IF start_date > end_date THEN
RETURN -1;
END IF;

SELECT TIMESTAMPDIFF(DAY, start_date, end_date) INTO v_day;

SELECT (DATE_FORMAT(end_date, '%Y') - DATE_FORMAT(start_date, '%Y')) INTO v_year;

IF DATE_FORMAT(start_date, '%m%d') = '0229' THEN
SET v_start_date = DATE_FORMAT(start_date, '%Y-03-01');
END IF;

IF DATE_FORMAT(end_date, '%m%d') = '0229' THEN
SET v_end_date = DATE_FORMAT(end_date, '%Y-%m-28');
END IF;

IF v_year > 0 THEN
SET @s_date = DATE_FORMAT(v_start_date, '2014-%m-%d');
SET @e_date = DATE_FORMAT(v_end_date, '2015-%m-%d');
ELSE
SET @s_date = DATE_FORMAT(v_start_date, '2015-%m-%d');
SET @e_date = DATE_FORMAT(v_end_date, '2015-%m-%d');
END IF;

SELECT TIMESTAMPDIFF(DAY, @s_date, @e_date) INTO v_base_day;

IF v_year > 0 THEN
SELECT v_day - (v_base_day + 365 * (v_year - 1)) INTO v_leay_year_days;
ELSE
SELECT v_day - (v_base_day + 365 * v_year) INTO v_leay_year_days;
END IF;
RETURN v_leay_year_days;

END$$

DELIMITER ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
测试用例:

SELECT start_date
, end_date
, F_GET_LEAYYEAR_DAYS(start_date, end_date) AS days
FROM (
SELECT 20110201 AS start_date, 20111001 AS end_date
UNION ALL
SELECT 20110201 AS start_date, 20121001 AS end_date
UNION ALL
SELECT 20120229 AS start_date, 20120229 AS end_date
UNION ALL
SELECT 20120229 AS start_date, 20130228 AS end_date
UNION ALL
SELECT 20110201 AS start_date, 20171001 AS end_date
) t ;
参考技术B 计算有多少个闰年就知道有多少个2.29了。

js 怎么计算出 两个日期之间相差多少月 比如:

js 怎么计算出 两个日期之间相差多少月 比如:
“2011-05” 到 “2012-07” 相差多少月
并且 能得到 201105 201106 201107 ................这样的数据传入后端
同时得到 2011年5月 2011年6月 2011年 7月 .......................这样的数据传入后端

用js怎么处理这个时间差

参考技术A function monthDiff(d1, d2)
var months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
months += d2.getMonth();
return months <= 0 ? 0 : months;


monthDiff(
new Date(2008, 10, 4), // November 4th, 2008
new Date(2010, 2, 12) // March 12th, 2010
);
// Result: 15: December 2008, all of 2009, and Jan & Feb 2010

monthDiff(
new Date(2010, 0, 1), // January 1st, 2010
new Date(2010, 2, 12) // March 12th, 2010
);
// Result: 1: February 2010 is the only full month between them

monthDiff(
new Date(2010, 1, 1), // February 1st, 2010
new Date(2010, 2, 12) // March 12th, 2010
);
// Result: 0: There are no *full* months between them
参考技术B 
function getD(a,b)
var arrA = a.split("-"),
arrB = b.split("-"),
yearA = arrA[0],
yearB = arrB[0],
monthA = +arrA[1],
monthB = (yearB-(+yearA))*12+parseInt(arrB[1]),
rA = [],
rB = [];

do
do
rA.push(yearA+""+(monthA > 9 ? monthA : "0"+monthA));
rB.push(yearA+"年"+monthA+"月");
if(monthA == 12)
monthA=1;
monthB -= 12;
break;

while(monthB > monthA++)
while(yearB > yearA++)

return [rA,rB];


var c = getD("2011-05","2012-12");
alert(c)本回答被提问者采纳
参考技术C 有编程嘛!!!

以上是关于mysql 计算两个日期间有多少个2月29的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句计算两个日期之间有多少个工作日的方法

SQL是计算两个日期相差多少天数的函数?

Oracle,获取2个日期间有多少个周六和周日

hihoCoder 1148 2月29日

php计算两个日期相隔多少年,多少月,多少天

两个日期之间的特定天数