mysql 按天分组少天数,按天分组记录,包括MySQL之间不包含记录的天数

正如

@Strawberry所建议的那样,我最终用php而不是mysql编写了一个解决方案.对于任何感兴趣的人,这是代码.

此解决方案仅在空白日期之间的1天内返回0,因为这就是我所需要的.例:

> 2017年5月11日= 1

> 2017年5月16日= 0

> 2017年5月17日= 1

> 2017年5月19日= 0

> 2017年5月20日= 2

这让我可以像这样显示一个趋势线图:6gEqa.png

$sql = 'SELECT DATE(poll_vote.date_insert) AS date_insert, COUNT(poll_vote.id_vote) AS q FROM poll_vote WHERE poll_vote.id_poll = :id_poll GROUP BY DATE(date_insert) ORDER BY date_insert';

$stmt = cnn()->prepare($sql);

if($id_poll) $stmt->bindValue(':id_poll', $id_poll, PDO::PARAM_INT);

$stmt->execute();

$data = $stmt->fetchAll();

# insert blank dates between existing dates

$hotness = array();

foreach($data as $item) {

if(!$temp) {

$temp = $item['date_insert'];

} else {

$date_past = new DateTime($temp);

$date_now = new DateTime($item['date_insert']);

$diff = $date_now->diff($date_past)->format("%a");

if($diff > 1) {

$date_new = new DateTime($item['date_insert']);

$date_new->modify('-1 day');

$hotness[] = array(

'date_insert' => $date_new->format('Y-m-d'),

'q' => 0

);

}

}

$hotness[] = array(

'date_insert' => $item['date_insert'],

'q' => $item['q']

);

}

# final result

print_r($hotness);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL 中的日期类型通常用于处理和操作日期时间数据。日期数据可以按照标准的日期格式(例如YYYY-MM-DD)存储,并支持一系列的操作,如提取年份、月份、日期等信息。 当你提到“日期类型按天分组”,这通常是指对包含日期的数据集进行聚合操作时的一种需求,目的是为了统计每天特定事件的数量、总金额或者其他统计数据。这种操作通常在数据分析、报告生成、日志分析等领域非常常见。 在 SQL 中,你可以通过以下步骤完成这一任务: ### 1. **选择日期列** 首先,你需要确定数据库表中包含日期的字段名。 ```sql SELECT date_column_name AS Date ``` ### 2. **使用 GROUP BY 子句** `GROUP BY` 子句允许你基于某个列的值将行分组起来。对于按天分组的需求,我们需要从日期中提取出唯一的天数作为分组依据。大多数数据库系统提供了一些函数帮助我们提取日期的不同部分,比如 `DATE_TRUNC()` 或 `TRUNCATE_DATE()` 等(具体函数名称因数据库系统而异),用于将日期调整到所需的粒度,通常是天。 例如,在 PostgreSQL 中,可以使用 `EXTRACT(EPOCH FROM DATE_TRUNC('day', your_date_column))` 来获取每个日历日的时间戳: ```sql SELECT EXTRACT(EPOCH FROM DATE_TRUNC('day', date_column_name)) * (1 / (24 * 60 * 60)) as day, COUNT(*) as daily_count FROM table_name GROUP BY day; ``` 在这个查询中: - `DATE_TRUNC('day', date_column_name)` 将日期调整到每天的开始。 - `EXTRACT(EPOCH FROM ...)` 计算这个时间戳与 Unix 时间戳的差异,转换为天数。 - `COUNT(*)` 统计每组(每天)的记录数量。 ### 3. **应用聚合函数** 为了得到每天的统计数据,通常需要配合其他聚合函数,如 `SUM()`, `AVG()`, `MAX()`, `MIN()` 等,取决于你想计算的具体统计指标。 例如,如果你想计算每一天的销售额总和: ```sql SELECT EXTRACT(EPOCH FROM DATE_TRUNC('day', sales_date)) * (1 / (24 * 60 * 60)) as day, SUM(sales_amount) as total_sales FROM sales_table GROUP BY day; ``` ### 相关问题: 1. 在 MySQL 中如何实现日期类型的按天分组? 2. 如何利用 SQL 的窗口函数来进行复杂的日期时间数据分析? 3. 数据库中日期时间数据的最佳实践是什么? 这些疑问可以帮助深入探讨日期时间操作的各种高级技巧和最佳做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值