mysql - 如何使用mysql计算两个日期之间的星期日数

标签 mysql

我需要使用 mysql 查找两个日期之间的星期日数。我知道如何使用 PHP 进行计算,但我需要使用 mysql 进行计算。

最佳答案

SET @START_DATE = '2014-01-22';
SET @END_DATE = '2014-06-29';
SELECT 
    ROUND((
      (unix_timestamp(@END_DATE) - unix_timestamp(@START_DATE) ) /(24*60*60)
      -7+WEEKDAY(@START_DATE)-WEEKDAY(@END_DATE)
    )/7)

 + if(WEEKDAY(@START_DATE) <= 6, 1, 0)
 + if(WEEKDAY(@END_DATE) >= 6, 1, 0) as Sundays;

解决方案由两部分组成:

  1. 计算完整周数(ROUND 部分),显然 7 周内有 7 个星期日。
  2. 计算非整周部分(第一个或最后一个)中包含的天数

如果你需要多次使用它,你可以将它包装到函数中:

DROP function IF EXISTS `count_weekdays`;
DELIMITER $$
CREATE FUNCTION `count_weekdays` (startDate date, endDate date, wd int)
RETURNS INTEGER
BEGIN
RETURN ROUND((
      (unix_timestamp(endDate) - unix_timestamp(startDate) ) /(24*60*60)
      -7+WEEKDAY(startDate)-WEEKDAY(endDate)
    )/7)

 + if(WEEKDAY(startDate) <= wd, 1, 0)
 + if(WEEKDAY(endDate) >= wd, 1, 0);
END$$

DELIMITER ;

然后你就可以像这样使用它了:

SET @START_DATE = '2018-07-03';
SET @END_DATE = '2018-07-28';
select 
  count_weekdays(@START_DATE, @END_DATE, 6) as Sundays,

  count_weekdays(@START_DATE, @END_DATE, 5) 
+ count_weekdays(@START_DATE, @END_DATE, 6) as weekends;

其中 6 ~ 工作日数代表周日,5 ~ 周六。

关于mysql - 如何使用mysql计算两个日期之间的星期日数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165407/

相关文章:

php - 将包含数组的表单数据安全插入 mysql 数据库

php - 如何在 php 中将结果集数组拆分为字符串

mysql - 当我删除一行时,id 号也会删除

MySQL 列输入

mysql - 每周提取趋势数据

python - 使用 blob 值时 mysql 数据库插入错误

mysql - 如果单个字段 "name"包含名字和姓氏,如何按姓氏获取顺序

php - 如何立即返回mysql中的表达式结果

mysql - 如何使用子查询删除行 - mysql

java - 组织.hibernate.PropertyAccessException : Could not set field value with Composite Key