1

假设我有一个类似于以下的表(简化):

| Name  | Date     | Hours |
| Bob   | 10/1/13  |  5    |
| John  | 10/1/13  |  8    |
| Bob   | 10/2/13  |  6    |
| Ashley| 10/2/13  |  4    |
...
| Bob   | 10/17/13 |  4    |
| John  | 10/17/13 |  6    |
| John  | 10/18/13 |  3    |
...

给定一个开始日期(比如 10/1/13),我如何构造一个查询以按 14 天的间隔对名称、SUM(小时)进行分组?所以结果会是这样的:

| Name  | Period              | SUM(Hours) |
| Bob   | 10/1/13 - 10/14/13  |  11        |
| John  | 10/1/13 - 10/14/13  |  8         |
| Ashley| 10/1/13 - 10/14/13  |  4         |
| Bob   | 10/15/13 - 10/29/13 |  4         |
| John  | 10/15/13 - 10/29/13 |  9         |

我尝试过帖子中列出的建议,例如:按日期范围按周/月间隔分组 但他们通常假设您想​​要实际的周数。由于这些只是 14 天的间隔,它们不一定与一年中的星期一致。

任何建议或指导表示赞赏!

编辑:这是查询 NexusDB 服务器,因此它使用 SQL:2003 标准。

4

1 回答 1

3

可能这样的事情可以工作吗?(假设它是 MySQL)

更新:在 SQL Fiddle 中测试(感谢@pm-77-1):http ://sqlfiddle.com/#!2/3d7af/2

需要注意的是:由于我们在这里进行日期运算,如果在大表上运行此查询可能会变得很繁重。

SELECT Name, 
CONCAT(DATE_ADD(<your-starting-date>, INTERVAL period*14 day),
" - ",
DATE_ADD(<your-starting-date>, INTERVAL period*14+13 day)) as Period,
Hours FROM 
(SELECT Name, 
FLOOR(DATEDIFF(Date,<your-starting-date>)/14) AS period, 
SUM(Hours) as Hours 
FROM <yourtable> GROUP BY period, name) p;

更新 NexusDB。我在 NexusDB 中找到了一些关于 DateDiff 替换的信息:

http://www.nexusdb.com/support/index.php?q=node/10091

考虑到这一点,您有两种选择:要么将该函数添加到您的数据库中,然后您就不必修改查询,或者用该定义替换 DATEDIFF:

SELECT Name, 
CONCAT(DATE_ADD(<your-starting-date>, INTERVAL period*14 day),
" - ",
DATE_ADD(<your-starting-date>, INTERVAL period*14+13 day)) as Period,
Hours FROM 
(SELECT Name, 
FLOOR(cast((cast(Date as float ) - cast(<your-starting-date> as float)) as integer)/14) as period,
SUM(Hours) as Hours 
FROM <yourtable> GROUP BY period, name) p;
于 2013-10-16T02:09:59.123 回答