跨日期范围的 MySQL 求和值

标签 mysql date between

我有一个表格,每一行都包含一个日期和一些任意的数值。我需要针对特定​​但动态的日期间隔对这个值求和。

SELECT VERSION();
5.0.51a-24+lenny5

CREATE TABLE IF NOT EXISTS `work_entries` (
  `entry_id` int(10) unsigned NOT NULL auto_increment,
  `employee_id` tinyint(3) unsigned NOT NULL,
  `work_date` date NOT NULL,
  `hour_count` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`entry_id`)
);

INSERT INTO `work_entries` (`entry_id`, `employee_id`, `work_date`, `hour_count`) VALUES
(1, 1, '2011-04-25', 2),
(2, 1, '2011-04-26', 3),
(3, 1, '2011-04-27', 1),
(4, 2, '2011-04-25', 2),
(5, 2, '2011-04-27', 4),
(6, 1, '2011-05-08', 2),
(7, 2, '2011-05-06', 8),
(8, 2, '2011-05-08', 9),
(9, 2, '2011-05-09', 1),
(10, 1, '2011-05-29', 3),
(11, 1, '2011-05-30', 1),
(12, 2, '2011-05-30', 2),
(13, 1, '2011-06-02', 2),
(14, 1, '2011-06-04', 3),
(15, 1, '2011-06-14', 1),
(16, 2, '2011-06-14', 2),
(17, 2, '2011-06-17', 4),
(18, 1, '2011-06-18', 2),
(19, 2, '2011-06-19', 8),
(20, 2, '2011-06-26', 9),
(21, 2, '2011-07-01', 1),
(22, 1, '2011-07-03', 3),
(23, 1, '2011-07-03', 1),
(24, 2, '2011-07-16', 2);

以下查询返回上述数据集的正确输出,应该说明我正在尝试做什么,但是,我需要根据 work_date 生成年和月值。日子 (16, 15) 永远不会改变。具体来说,此查询将生成两行,一行用于指定的时间间隔,另一行用于其余时间,其中每个时间段需要一行(对于所有具有值的月份,N 月 16 日到 N+1 月 15 日)。

SELECT
 SUM(hour_count) AS res
 FROM `work_entries`
 GROUP BY work_date
 BETWEEN '2011-04-16' AND '2011-05-15';

-- Outputs
res
----
44
32

-- Should give
res
----
32
14
28
 2

另一个可以正常工作但间隔错误(01-31 天)的替代示例:

SELECT
 SUM(hour_count) AS res
 FROM `work_entries`
 GROUP BY MONTH(work_date);

-- Outputs
res
---
12
26
31
 7

此外,如果有一种方法可以同时输出起始日期和截止日期,我也很喜欢,但这不是很重要。

最佳答案

可爱的:

SELECT
 SUM(hour_count)
 FROM `work_entries`
 GROUP BY
   YEAR(work_date - INTERVAL 15 DAY),
   MONTH(work_date - INTERVAL 15 DAY);

关于跨日期范围的 MySQL 求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718413/

相关文章:

sql-server - sql : BETWEEN v1 AND v2

MySQL 中日期和 BETWEEN 的奇怪之处

php - Blade 中的 Laravel 5.5 Eloquent 请求和许多 sql 查询

r - 从POSIXct对象中提取星期数

php - 当 WHERE 不匹配时,在 COUNT 列中显示 "0"?

php - 将 TIMESTAMP 和时区转换为不同的时区

安卓获取日期

mysql - 使 Zend\Db (zf2) 包含在子句之间

MYSQL在超过2个连接表的不同列中选择不同的值

php - 使用 Active Record 类转义 codeigniter 进行 sql 注入(inject)