如果你把今天所做之事重复 365 次,明年你会获得你想要的吗?

本文引用了凯文·凯利70岁生日时提出的103条人生建议,探讨如何通过重复每天的行为并在一年后达成目标。提出当遇到问题时,向他人阐述问题常常能揭示解决方案,并强调先明确个人成长目标才能有效决定当下行动。

If you repeated what you did today 365 more times will you be where you want to be next year?

来自凯文 · 凯利70岁生日的103条人生建议

我想要什么呢?想要解决当前的问题,那么我当前的问题是什么呢?

103条中另一条可以参考下:
When you are stuck, explain your problem to others. Often simply laying out a problem will present a solution. Make “explaining the problem” part of your troubleshooting process. 当你举步不前时,向别人解释你的问题。通常情况下,简单地摆出问题就能得到解决方案。让「解释问题」成为你解决麻烦过程的一部分。

以及另一条:
The only productive way to answer “what should I do now?” is to first tackle the question of “who should I become?” 要回答「我现在该干嘛」的最高效方式是先搞清楚「我想成为怎样的人」。

全文103条链接:nonsense.zhubai.love/posts/2132088886883684352

<think>我们有一个MySQL表a,包含字段:id, recive(电话号码), createTime(数据录入时间)。 需求:统计今年内每个recive号码的记录数量。 注意:今年内,即createTime字段在今年的记录。 步骤: 1. 我们需要筛选出createTime在今年的记录。 2. 按照recive电话号码进行分组。 3. 统计每个分组内的记录数量。 假设当前年份是2023年(注意:实际使用中可能需要动态获取当前年份,但SQL中可以使用YEAR函数和CURDATE函数) 我们可以这样写: 使用YEAR(createTime) = YEAR(CURDATE()) 来获取今年的记录。 然后按recive分组,使用COUNT(*)统计每个分组的数量。 SQL语句如下: ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE YEAR(createTime) = YEAR(CURDATE()) GROUP BY recive; ``` 但是,注意:如果表数据量很大,对createTime使用函数可能会影响性能,因为无法使用索引。我们可以考虑使用范围查询: 例如,先计算今年的开始和结束日期。 改进版: ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE createTime >= DATE_FORMAT(NOW(), '%Y-01-01 00:00:00') AND createTime < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 YEAR), '%Y-01-01 00:00:00') GROUP BY recive; ``` 解释: - `NOW()` 获取当前日期时间。 - `DATE_FORMAT(NOW(), '%Y-01-01 00:00:00')` 得到今年第一天(如2023-01-01 00:00:00)。 - `DATE_ADD(NOW(), INTERVAL 1 YEAR)` 是明年当前时间,再格式化为明年的第一天,即`createTime < '2024-01-01 00:00:00'`,这样就能包含今年所有时间。 这样写可以利用createTime上的索引(如果有的话),效率更高。 因此,推荐使用第二种写法。 另外,如果表中有大量数据,且只需要统计记录数,可以考虑在recive和createTime上建立索引。 注意:由于用户引用中提到了“重复性高的需求”[^1],可能意味着这个查询会被频繁执行,所以性能优化很重要。 根据引用[2]中提到的分片键和索引的概念,我们可以考虑在createTime和recive上建立复合索引,这样查询效率更高。 索引建议(如果还没有的话): ```sql CREATE INDEX idx_createTime_recive ON a(createTime, recive); ``` 但是,如果数据量特别大,可能还需要考虑其他优化,比如分表分库(引用[2]中提到了分片键),但这不是本SQL要解决的问题。 因此,最终SQL语句为: ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE createTime >= CONCAT(YEAR(CURDATE()), '-01-01 00:00:00') AND createTime < CONCAT(YEAR(CURDATE())+1, '-01-01 00:00:00') GROUP BY recive; ``` 或者使用日期函数(更准确,避免闰年等问题): ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE createTime >= MAKEDATE(YEAR(CURDATE()), 1) -- 这一年的第一天 AND createTime < MAKEDATE(YEAR(CURDATE())+1, 1) -- 下一年的第一天 GROUP BY recive; ``` 但是注意:`MAKEDATE`函数返回的是日期(没有时间部分),所以如果createTime带有时间部分,那么: - `>= MAKEDATE(YEAR(CURDATE()), 1)` 会包含今年第一天00:00:00及之后。 - `< MAKEDATE(YEAR(CURDATE())+1, 1)` 会包含到明年第一天的00:00:00之前(即今年最后一天的23:59:59.999...)。 所以这个条件可以包含整个今年。 我们也可以使用: ```sql WHERE createTime BETWEEN MAKEDATE(YEAR(CURDATE()), 1) AND CONCAT(YEAR(CURDATE()), '-12-31 23:59:59.999999') ``` 但是使用BETWEEN需要注意时间精度,而且如果使用小于下一年的第一天,则更通用。 综上所述,我们选择使用小于下一年的第一天的写法。 因此,最终SQL语句(两种写法都可以,这里选择用DATE_FORMAT): ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE createTime >= DATE_FORMAT(CURDATE(), '%Y-01-01') AND createTime < DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 YEAR), '%Y-01-01') GROUP BY recive; ``` 注意:CURDATE()只返回日期部分,所以时间部分为00:00:00。因此,我们使用DATE_FORMAT(CURDATE(), '%Y-01-01')得到今年1月1日,同样,下一年的1月1日也是00:00:00。 这样,查询条件就是:createTime >= 今年1月1日00:00:00 且 < 明年1月1日00:00:00,正好是今年全年。 我们输出这个SQL即可。 另外,如果用户需要看到电话号码和对应的记录数,这个SQL可以满足。 如果用户需要按照记录数排序,可以加上ORDER BY: ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE createTime >= DATE_FORMAT(CURDATE(), '%Y-01-01') AND createTime < DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 YEAR), '%Y-01-01') GROUP BY recive ORDER BY record_count DESC; -- 按记录数降序排列 ``` 根据用户需求,没有要求排序,所以可以不加,但加上排序可能更直观。 考虑到用户需求是“查看每个号码一年有多少记录”,按记录数从多到少排序可能更符合查看习惯。 因此,我们加上排序。 最终SQL: ```sql SELECT recive, COUNT(*) AS record_count FROM a WHERE createTime >= DATE_FORMAT(CURDATE(), '%Y-01-01') AND createTime < DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 YEAR), '%Y-01-01') GROUP BY recive ORDER BY record_count DESC; ``` 注意:如果recive字段为空,也会被分组统计。如果不想统计空值,可以加上条件:recive IS NOT NULL。 根据需求,用户没有特别说明,但通常电话号码不应该为空,所以可以不加。如果存在空值,用户可能需要注意,所以这里我们不处理。 另外,引用[3]提到了定时任务,引用[4]是微信消息结构,与当前问题无关。 所以,我们给出上述SQL。 最后,根据系统指令,生成相关问题: </think> 根据您的需求,需要统计MySQL表`a`中`recive`字段(电话号码)在**今年内**每个号码出现的记录数量。以下是完整的SQL解决方案: ### 推荐SQL语句 ```sql SELECT recive AS 电话号码, COUNT(*) AS 记录数量 FROM a WHERE createTime >= MAKEDATE(YEAR(CURDATE()), 1) -- 今年第一天 AND createTime < MAKEDATE(YEAR(CURDATE()) + 1, 1) -- 明年第一天 GROUP BY recive ORDER BY 记录数量 DESC; ``` ### 关键点说明 1. **时间范围筛选** - `MAKEDATE(YEAR(CURDATE()), 1)`:动态获取今年1月1日(如2023-01-01) - `< MAKEDATE(YEAR(CURDATE())+1, 1)`:截止到明年1月1日(不包含) - 此方法避免使用`YEAR()`函数索引失效问题[^1] 2. **分组统计** - `GROUP BY recive`:按电话号码分组 - `COUNT(*)`:统计每组的记录数 3. **排序优化** `ORDER BY 记录数量 DESC`:按记录数降序排列,便于查看高频号码 ### 性能优化建议 1. **索引配置** 添加复合索引可提升查询速度: ```sql CREATE INDEX idx_time_recive ON a(createTime, recive); ``` 该索引可加速时间筛选和分组操作[^2] 2. **空值处理(可选)** 若需排除空号码: ```sql WHERE recive IS NOT NULL AND createTime >= ... ``` 3. **跨年边界处理** 使用`MAKEDATE`函数自动适应闰年等场景,比硬编码更可靠 ### 示例输出 | 电话号码 | 记录数量 | |------------|----------| | 13800138000 | 125 | | 13900139000 | 89 | | 13700137000 | 76 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值