SQL日期差计算:DATEDIFF函数跨数据库差异与性能优化全解析
1. 先搞清楚 DATEDIFF 到底在算什么1.1 函数签名两个日期、一个结果DATEDIFF 这个函数表面上看特别简单传入两个日期返回一个数值表示这两个日期之间相差的天数。这在数据看板、用户生命周期分析、订单超时监控里几乎天天要用。但真正写过一段时间 SQL 的人都会遇到同一个问题在不同的数据库里DATEDIFF 的行为、参数顺序、返回结果完全不是一个东西。同一个函数名在项目迁移的时候常常是最先爆炸的那批代码之一。我见过不止一次团队在从某数据库往另一套系统迁移时业务侧抽数逻辑大面积报错追到底就是 DATEDIFF 的参数顺序不同。比如某个数据库是DATEDIFF(date1, date2)另一个是DATEDIFF(datepart, startdate, enddate)。你从第一个往第二个迁原本写在右边的日期变成了第二个参数语义直接颠倒统计出来的最近7天瞬间变成未来7天接口返回的数据全是负数天数。所以在深入用之前先搞清楚一件事DATEDIFF 不是一个标准化函数它是每套数据库各自实现的一个同名但不同义的工具。接下来我会把主流数据库的行为差异、底层语义、实际使用姿势和坑位一整套讲清楚。1.2 容易被忽略的边界计数语义DATEDIFF 有两个不同的底层语义理解了这个很多诡异结果就能解释通了。第一类是按自然日差值算典型代表是 MySQL 的DATEDIFF(expr1, expr2)。它做的事情非常简单粗暴把两个日期的时间部分扔掉只保留日期然后计算expr1 - expr2的天数。比如DATEDIFF(2023-02-02 23:59:59, 2023-02-01 00:00:00)返回 1因为只看日期部分2023-02-02 减去 2023-02-01 是 1 天哪怕实际时间只差了不到 24 小时。第二类是按跨边界次数算典型代表是 SQL Server 的DATEDIFF(datepart, startdate, enddate)。它计算的是从 startdate 到 enddate 跨越了多少个指定单位的边界而不是真正相差多少个完整单位。最经典的例子DATEDIFF(YEAR, 2019-12-31, 2020-01-01)返回 1。虽然两个日期只差了一天但是跨过了年份的边界。同理DATEDIFF(MONTH, 2019-01-31, 2019-02-01)也返回 1哪怕实际只过了一天。这两种语义在日常使用中会产生完全不同的结果。如果你在用 MySQL 的习惯去理解 SQL Server 的 DATEDIFF会在月份差、年份差上栽大跟头。这不是 bug是设计如此。数据库厂商当年就是这么设计实现的我们要做的是记住差异在写跨库兼容 SQL 的时候格外小心。2. 不同数据库的 DATEDIFF 差异对照2.1 MySQL / MariaDBDATEDIFF 只管天数MySQL 的 DATEDIFF 语法是DATEDIFF(expr1, expr2)返回 expr1 减去 expr2 的天数。这里有个非常关键的点它只比较日期部分时间部分会被直接忽略。所以我在生产环境里经常提醒团队如果业务需求是计算两个时间点之间精确到秒的间隔千万别用 DATEDIFF要用TIMESTAMPDIFF(SECOND, ...)。看几个实际查询结果SELECT DATEDIFF(2023-02-01, 2023-01-01); -- 31 SELECT DATEDIFF(2023-01-02 23:59:59, 2023-01-01 00:00:00); -- 1时间被忽略 SELECT DATEDIFF(2023-01-01, 2023-01-02); -- -1前小后大得到负数 SELECT TIMESTAMPDIFF(HOUR, 2023-01-01 00:00:00, 2023-01-02 01:00:00); -- 25精确按时间差算如果你需要按天维度判断DATEDIFF 够用如果你需要小时、分钟、秒用TIMESTAMPDIFF它支持 FRAC_SECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER、YEAR 这些单位而且它和 DATEDIFF 还有一个重要区别TIMESTAMPDIFF是基于完整周期数来计算的TIMESTAMPDIFF(MONTH, 2019-01-31, 2019-02-01)返回 0因为虽然跨月了但并没有满一个月。2.2 SQL ServerDATEDIFF 可以精确到秒级SQL Server 的 DATEDIFF 语法是DATEDIFF(datepart, startdate, enddate)datepart 可以是 YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MILLISECOND 等。它计算的是 enddate 减 startdate 的结果。返回类型是 int。这意味着一个容易踩的坑如果你用DATEDIFF(MILLISECOND, ...)计算两个日期之间相差的毫秒数int 的上下限大约是 ±21 亿换算成天数是大约 24.8 天。一旦跨度超过这个范围直接报算术溢出错误。SQL Server 2022 开始提供了DATEDIFF_BIG返回 bigint解决了这个问题但如果你的环境还是老版本就要小心毫秒级的 DATEDIFF 溢出了。边界计数语义在这套函数里体现得最明显。跨过一次跨日DAY 就加 1跨过一次跨月MONTH 就加 1。举几个典型例子SELECT DATEDIFF(HOUR, 2023-01-01 09:00:00, 2023-01-01 09:59:59); -- 0 SELECT DATEDIFF(HOUR, 2023-01-01 09:59:59, 2023-01-01 10:00:00); -- 1 SELECT DATEDIFF(MONTH, 2023-06-30 23:59:59, 2023-07-01 00:00:00); -- 1第一个查询里09:00:00 到 09:59:59 之间没有跨过整点所以 HOUR 差是 0。第二个从 09:59:59 到 10:00:00哪怕只差 1 秒因为跨过了 10 点这个整点边界HOUR 差就是 1。这就是边界计数——它统计的是撞线次数不是间隔长度。2.3 PostgreSQL、Oracle、SQLite 的替代方案这三个数据库都没有一个叫 DATEDIFF 的函数或者像 SQLite 那样行为不太一样。很多从 MySQL 或 SQL Server 转过来的同学第一反应是找同名的函数结果发现 PostgreSQL 里直接报function datediff(unknown, unknown) does not exist。别慌它们的做法本质上是一样的只是换了个名字。PostgreSQL 里日期相减直接用减号SELECT DATE 2023-02-01 - DATE 2023-01-01; -- 整数 31 SELECT TIMESTAMP 2023-01-02 01:00:00 - TIMESTAMP 2023-01-01 00:00:00; -- interval 1 day 01:00:00 SELECT EXTRACT(EPOCH FROM (TIMESTAMP 2023-01-02 01:00:00 - TIMESTAMP 2023-01-01 00:00:00)) / 3600; -- 25.0转为小时数Oracle 里日期减日期返回的就是天数而且是带小数的天数。两个 DATE 相减整数部分是天数小数部分是时分秒换算的余量SELECT TO_DATE(2023-02-01 12:00:00, YYYY-MM-DD HH24:MI:SS) - TO_DATE(2023-01-01 00:00:00, YYYY-MM-DD HH24:MI:SS) FROM dual; -- 1.5SQLite 则是用julianday函数把日期转成儒略日再相减SELECT julianday(2023-02-01) - julianday(2023-01-01); -- 1.0 SELECT CAST(julianday(2023-02-01) - julianday(2023-01-01) AS INTEGER); -- 1所以看重的是跨数据库写 SQL 时不要默认 DATEDIFF 存在先看一眼目标环境。同一个函数名在不同数据库里行为不同是常态不同数据库用不同方式算日期差也是常态。2.4 一张表看懂各库差异数据库函数/写法返回类型边界计数时间部分处理常用替代MySQL / MariaDBDATEDIFF(expr1, expr2)整数天数否忽略TIMESTAMPDIFFSQL ServerDATEDIFF(datepart, startdate, enddate)int是参与比较DATEDIFF_BIGPostgreSQLdate - date整数天数否忽略EXTRACT(EPOCH ...)Oracledate - date小数天数否保留小数部分MONTHS_BETWEENSQLitejulianday(a) - julianday(b)小数天数否保留小数部分strftime(%s)这张表建议直接存下来。每次写日期差逻辑之前先想好自己的环境是哪个。我曾经在一次工作坊里让人家猜DATEDIFF(DAY, 2023-06-30 12:00:00, 2023-07-01 12:00:00)的结果十个人里有七个猜不对。不是大家笨是这套语义本身就不直观厂商文档也不会特意强调我是按边界数的。3. 实战场景日期差计算怎么落地业务3.1 算年龄的正确姿势年龄计算是 DATEDIFF 使用频率最高的场景之一。但很多人写的年龄 SQL 都有问题。拿 MySQL 举例最直接的想法是SELECT DATEDIFF(CURDATE(), birth_date) / 365 AS age FROM users;这种方法在多数场景下看着差不多但实际误差不小因为 365 天并不等于一年闰年会直接导致年龄偏大或偏小。比如一个出生在 2020-02-29 的用户在 2021-02-28 那天DATEDIFF 算出来是 365除以 365 岁就是 1 岁但严格说他还没有满周岁因为 2021 年没有 2 月 29 日。更稳妥的做法有三种第一种MySQL / MariaDB 用TIMESTAMPDIFF(YEAR, birth_date, CURDATE())。它按年周期判断满不满一年属于完整周期语义在闰年场景下也更符合生日没过就不算长大一岁的自然直觉。第二种SQL Server 用DATEDIFF(YEAR, birth_date, GETDATE())之后再做一个生日补偿判断如果今年生日还没到结果减 1。SELECT DATEDIFF(YEAR, birth_date, GETDATE()) - CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, birth_date, GETDATE()), birth_date) GETDATE() THEN 1 ELSE 0 END FROM users;这种粗算再补偿的写法在各个数据库里都能落地只是 DATEADD 和 DATEADD 的写法略有差异。第三种算月龄或精确到天数的年龄可以直接用日期差再配合取整。总之别再用除以 365这种省事写法糊弄业务尤其是涉及法律年龄、保险年龄的场景差一天都可能出纠纷。3.2 时间窗口筛选与近 N 天统计时间窗口查询是最容易写出慢查询的场景而且很多人都栽在函数包索引列上。比如我想查最近 7 天创建的订单-- 常见错误写法 SELECT * FROM orders WHERE DATEDIFF(CURDATE(), created_at) 7; -- 索引友好写法 SELECT * FROM orders WHERE created_at DATE_SUB(CURDATE(), INTERVAL 7 DAY);第一种写法在 MySQL 里会导致created_at上的索引失效因为你对列套了函数优化器无法直接利用 B 树的有序性。数据量小的时候感觉不出来一旦订单表到了千万级别这个查询能把数据库拖到告警。第二种写法把函数放到等号右侧的常量一侧created_at本身可以走索引扫描范围也小得多。如果你使用的是 SQL Server等价写法是这样的SELECT * FROM orders WHERE created_at DATEADD(DAY, -7, CAST(GETDATE() AS DATE)) AND created_at CAST(GETDATE() AS DATE) 1;这里面把今天先取成日期再回退 7 天最后用半开区间[起点, 明天)去圈定范围。这种写法既避免了DATEDIFF对列的包裹又规避了BETWEEN在时间精度上的漏数问题——用BETWEEN加一个精确到秒的今天 23:59:59终究会漏掉 23:59:59.500 这种尾巴用半开区间就干干净净。3.3 连续登录和间隔分析的进阶用法日期差在用户行为分析里经常用来算连续登录天数和用户最近一次活跃离今天有多远。连续登录的核心思路是把登录日期减去一个递增的行号如果日期是连续的那么减去行号之后得到的锚点日期是同一个。WITH login_rank AS ( SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn FROM login_log ) SELECT user_id, DATEDIFF(login_date, DATE_ADD(2023-01-01, INTERVAL rn - 1 DAY)) AS anchor_date, COUNT(*) AS continuous_days FROM login_rank GROUP BY user_id, anchor_date;这个思路的核心是连续日期在减去等差序列后会被映射到同一个锚点值。MySQL 里用 DATEDIFF 或者直接日期相减都能做。其实现代数仓里更常用的是DATE_ADDROW_NUMBER的方式思路一样只是数据库函数名换了一下。另一个高频需求是用户下一次下单距上一次下单的平均间隔。这种一般先用LAG取上一次下单时间然后用日期差函数算出间隔再做平均值SELECT user_id, AVG(interval_days) AS avg_gap_days FROM ( SELECT user_id, order_date, DATEDIFF(order_date, LAG(order_date) OVER (PARTITION BY user_id ORDER BY order_date)) AS interval_days FROM orders ) t WHERE interval_days IS NOT NULL GROUP BY user_id;这里要特别注意MySQL 的 DATEDIFF 只算天数所以算多个订单之间的间隔用天粒度是够的。但如果你要算小时级间隔比如同一天内的购买间隔就必须用TIMESTAMPDIFF(HOUR, ...)或者换成UNIX_TIMESTAMP差值再换算否则所有结果都会变成 0。这种用了不对粒度的函数导致结果全为 0 的问题在排障时特别隐蔽因为 SQL 不报错只返回不合理的结果。4. 高频踩坑与排查实录4.1 参数顺序写反结果全变负数MySQL 的DATEDIFF(expr1, expr2)是 expr1 减 expr2SQL Server 的DATEDIFF(datepart, startdate, enddate)是 enddate 减 startdatePostgreSQL 的date - date是左边的减右边的。三个主流数据库三种顺序这就是参数顺序最容易写错的根本原因。我自己有一次上线报表发现近 30 天销售额全部变成负数查了一圈最后定位到 SQL 里写的是DATEDIFF(created_at, CURDATE())。在 MySQL 里这相当于拿较早的创建时间去减当前时间结果当然是负数。修正后就正常了。排查建议写完之后拿一个最简单、结果可手工验算的例子跑一遍比如DATEDIFF(2023-01-02, 2023-01-01)看一眼结果是 1 还是 -1马上就能确认顺序。这种自查的成本极低但能避免上线后大半夜被叫起来修数据。4.2 时分秒如何干扰你的结果MySQL 忽略时间部分SQL Server 不忽略这是最经典的同一份逻辑换个库就变味的案例。比如有一个订单表记录的created_at是2023-06-01 23:59:59另一个订单是2023-06-02 00:00:00。在 MySQL 里跑DATEDIFF结果它们是同一天diff 是 0在 SQL Server 里跑DATEDIFF(DAY, ...)结果跨过午夜边界diff 是 1。你的业务如果是要按订单实际创建时间归类到某一天这两种方式会统计出完全不同的订单量。更隐蔽的是时分秒参与运算时产生的隐式转换问题。有些数据库在处理DATEDIFF(DAY, 2023-01-01 08:00:00, 2023-01-02 07:59:59)时也会返回 1因为跨了日边界。这些在测试环境里很难暴露因为测试数据的时间往往都是整点看不出问题。排查建议在写日期差逻辑之前先想清楚业务口径到底是按日历日划分还是按精确时间间隔划分。想清楚了再选择 DATEDIFF日历日还是精确时间差如 TIMESTAMPDIFF 或 UNIX_TIMESTAMP 差不要凭感觉选择函数。4.3 跨月、跨年、闰年的边界陷阱SQL Server 的 DATEDIFF 边界计数语义在跨月、跨年时会产生大量看起来不合理但函数就是这么设计的结果。SELECT DATEDIFF(MONTH, 2023-01-31, 2023-02-01); -- 1 SELECT DATEDIFF(YEAR, 2023-12-31, 2024-01-01); -- 1 SELECT DATEDIFF(YEAR, 2020-02-29, 2021-02-28); -- 1因为跨了年份边界如果你用 DATEDIFF 去判断两个时间是否在同一周、同一月、同一年边界计数反而好用。但如果你用它去计算两个事件之间真正经过了多少个完整月份那它会给出一堆偏差结果。一个完整的业务月份比如1月31号到下月28号算一个月这在 DATEDIFF(MONTH) 下就是 1但实际上大多数业务场景认为这不叫满一个月。跨月的坑还不止于此。有人用DATEDIFF(DAY, start_date, end_date)之后除以 30 算月份差这也是大忌。30 天不等于自然月业务上每个月固定给用户发一次权益这类逻辑必须按月边界或者精确日期规则来写。4.4 隐式类型转换与时区问题日期差函数接受字符串参数时不同数据库对字符串的解析规则不一样。比如 MySQL 的DATEDIFF(2023-13-01, 2023-01-01)字符串 2023-13-01 会做隐式转换但 13 月不是合法月份MySQL 会把它当作 2023-01-13 还是直接抛错取决于 sql_mode 的配置。这种事前不设防、事后数据错乱的场景最常见于从 CSV、Excel 或者第三方接口导入的日期字段。时区问题更隐蔽。如果你的数据库连接串指定了时区而应用服务器是另一个时区那么写入的时间戳本身可能就已经发生了偏移。此时 DATEDIFF 只是拿两个已经偏移过的值做差它不会帮你纠正只会忠实还原这个偏移后的差值。表现形式往往是每天早上看到的昨日订单数不对近 7 天的数据忽多忽少。排查建议先把所有日期字段统一成一种类型、一个时区再进 SQL。零散的字符串日期先CAST成标准类型跨时区的业务统一在应用层转成 UTC 存储展示层再做本地化转换。不要指望 DATEDIFF 帮你处理时区它只是个减法器。5. 性能优化让日期差查询跑得更快5.1 对索引列使用函数是大忌前面已经提过WHERE DATEDIFF(CURDATE(), created_at) 7这种写法会让索引失效。这背后其实涉及数据库优化器的工作原理当一列被函数包裹时优化器无法判断函数结果和原列值之间的序关系它只能退化成全表扫描把每一行的列值都算一遍函数再和常量比较。这在百万行的小表上可能只慢几百毫秒但到了亿级大表就是灾难。更麻烦的是这种慢查询往往不会立刻暴露它会悄悄变慢直到某天并发一上来数据库 CPU 直接被打满。所以写日期范围查询的第一原则永远不要对索引列套函数。要么把函数加到等号右侧的常量上要么改写为范围条件。5.2 用半开区间替代 BETWEEN另外一个高频性能问题是BETWEEN的边界处理。很多人写查某一天的数据是这样写的SELECT * FROM orders WHERE created_at BETWEEN 2023-06-01 00:00:00 AND 2023-06-01 23:59:59;这个写法最大的隐患是 23:59:59 这个时间点本身不够右闭合。如果数据里有一条2023-06-01 23:59:59.500的记录它会被漏掉。如果你把右边界写成2023-06-02 00:00:00又不对会多算一条。标准做法是半开区间[start, end)右边取明天的零点SELECT * FROM orders WHERE created_at 2023-06-01 00:00:00 AND created_at 2023-06-02 00:00:00;这样既不会漏掉秒级尾数也更容易利用索引做范围扫描。MySQL 里要生成明天的零点可以直接DATE_ADD(DATE(2023-06-01), INTERVAL 1 DAY)SQL Server 里是DATEADD(DAY, 1, CAST(2023-06-01 AS DATE))。5.3 海量数据下时间差的预处理策略如果你的业务真的需要在查询里频繁计算两个时间字段的差值而且数据量大到跑不动光靠改写 SQL 是不够的。更合理的方案是预计算。比如订单表里有paid_at和created_at两个时间戳业务经常按DATEDIFF(paid_at, created_at)分组统计支付耗时分布。与其每次跑大查询不如在订单写入或状态变更的时候直接维护一个paid_elapsed_seconds字段计算好差值存进去。查询时直接按这个字段做分组和聚合毫秒级出结果。这种做法的本质是把查询时的计算成本转化为写入时的计算成本。对于读多写少的报表类业务收益非常明显。当然代价是如果时间字段后续被更新预计算字段也要跟着刷新。建议用存储过程或者任务调度来兜底保证数据一致性。另外如果跨库迁移时遇到 DATEDIFF 不兼容的问题一个通用的降级方案是先把时间转成统一的 epoch 秒数然后做减法再按业务需要除以 86400、3600、60。这种写法在各个数据库里几乎都能跑SELECT (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) / 86400 AS diff_days FROM ...MySQL 里直接用UNIX_TIMESTAMPPostgreSQL 里用EXTRACT(EPOCH FROM ...)SQLite 里用strftime(%s, ...)。日期差的核心是把时间变成可计算的数值函数名只是表面差异思路都是同一个。6. 进阶配方速查6.1 常用日期差计算的通用写法业务需求MySQL / MariaDBSQL ServerPostgreSQL两个日期相差天数DATEDIFF(d1, d2)DATEDIFF(DAY, start, end)d1::date - d2::date两个时间相差小时TIMESTAMPDIFF(HOUR, s, e)DATEDIFF(HOUR, s, e)EXTRACT(EPOCH FROM (e - s)) / 3600相差月份TIMESTAMPDIFF(MONTH, s, e)DATEDIFF(MONTH, s, e)需手写年差月差是否跨年YEAR(d1) YEAR(d2)DATEDIFF(YEAR, s, e) 0EXTRACT(YEAR FROM ...)与当前时间相差DATEDIFF(CURDATE(), col)DATEDIFF(DAY, col, GETDATE())CURRENT_DATE - col::date这套速查表适合放在团队的 SQL 规范文档里每次写日期差逻辑前翻一眼比自己背诵各数据库差异要靠谱得多。再强调一次MySQL 和 SQL Server 的参数顺序不一样直接背前大后小或者先小后大都会死唯一稳的方式是动手前先看一眼环境。6.2 我踩过坑之后留下的几条铁律这么多年写下来我的 SQL 代码里关于日期差的部分基本固定在这么几条铁律上第一日期差的选择取决于你关注的是日历边界还是真实时长。要看某日是否属于某月用边界计数要看支付到底花了多久用精确时间差。两个问题混用结果一定有一边是错的。第二对索引列永远使用范围查询不套函数。这条不只是 DATEDIFF 适用对所有日期函数都适用包括DATE(created_at) 2023-06-01这种写法同样会让索引失效。第三跨库迁移时统一用 epoch 秒做中间量。虽然看起来多一层转换但能最大程度抹平不同数据库之间的语义差异。我做过一次从 MySQL 迁到另一套查询引擎的改造就是把所有 DATEDIFF 都改成 epoch 差之后再换算上线后几乎没有出现日期差相关的兼容性 bug。第四写完了留一个手工可验算的测试用例。哪怕只是SELECT DATEDIFF(2023-01-02, 2023-01-01)也不费事但能一秒钟定位参数顺序问题。这个习惯救了我不止一次。第五点是给团队的请在 SQL 评审清单里增加一条日期差函数是否与目标数据库语义一致。很多线上事故不是逻辑复杂导致的而是大家默认 DATEDIFF 在所有数据库里长得一样。这么一个小函数迁移时踩坑的概率远高于你的直觉提前在规范层面堵住比事后修数据轻松太多。DATEDIFF 是个很小的函数但背后牵涉的语义理解、跨库兼容、性能陷阱和业务口径足以让一行看似人畜无害的查询变成生产事故的源头。希望这份偏实战的拆解能帮你把这一个函数彻底用明白。

相关新闻

码匠教育:为什么同样需求,不同人写出的 Python 代码差距悬殊

码匠教育:为什么同样需求,不同人写出的 Python 代码差距悬殊

在Python学习和职场落地中,有一个极其普遍的现象:面对完全相同的业务需求、完全一致的功能目标,不同开发者写出的代码,呈现出天差地别的效果。新手写出的代码冗长杂乱、冗余严重、运行卡顿、bug频发、无法迭代,而高阶开…

2026/10/11 22:58:43 阅读更多 →
冷热电联供系统多目标优化:NSGA-II代码实战与Pareto前沿分析

冷热电联供系统多目标优化:NSGA-II代码实战与Pareto前沿分析

简介:基于多目标算法的冷热电联供型综合能源系统MATLAB代码与操作视频,面向能源、电气及自动化等相关专业的本硕博学生与教研人员,可作为综合能源系统多目标优化课题的入门模板与实践参考。包内共4个文件,包括两个MATLAB脚本&…

2026/10/11 22:58:43 阅读更多 →
6 行代码把截图变成 Markdown/HTML/LaTeX:TeleOCR 极简调用实测

6 行代码把截图变成 Markdown/HTML/LaTeX:TeleOCR 极简调用实测

6 行代码把截图变成 Markdown/HTML/LaTeX:TeleOCR 极简调用实测 【免费下载链接】TeleOCR 项目地址: https://ai.gitcode.com/XingChen-AGI/TeleOCR 做技术分享和论文笔记时,最烦的就是截图里的内容无法直接复用:公式要手抄成 LaTeX&…

2026/10/11 22:58:43 阅读更多 →

最新新闻

Q-learning改进版全解析:目标网络、经验回放与Double Q实战

Q-learning改进版全解析:目标网络、经验回放与Double Q实战

简介:这份资源是基于Q-learning改进的强化学习算法实现,开发工具为MATLAB,面向路径规划与人工智能学习者,适合机器人导航、网格寻路、游戏AI等场景下的最优策略求解问题。ZIP压缩包共包含21个文件,以19个.m脚本为核心&…

2026/10/11 23:37:44 阅读更多 →
eladmin代码生成器深度解析:从元数据读取到自定义模板实践

eladmin代码生成器深度解析:从元数据读取到自定义模板实践

eladmin这套后台管理框架,最吸引我的是那个看起来不起眼的代码生成器。很多人把它当黑盒用——在界面上点几下,下载一个 zip,解压、拷贝,前后端代码就齐了。但一旦你想改改生成出来的代码风格,或者想给模板加点自己的东…

2026/10/11 23:37:44 阅读更多 →
二叉树对比面试题100道:概念、遍历与数据结构选型

二叉树对比面试题100道:概念、遍历与数据结构选型

我最近在系统刷算法面试题,发现一个特别明显的现象:二叉树这道菜,几乎每家都在考,但很少直接甩一句“请你求一下二叉树深度”,更多是“递归求深度和层序遍历求深度有什么区别”“堆和二叉搜索树都是二叉树,…

2026/10/11 23:37:44 阅读更多 →
GitHub日榜项目怎么选?从热榜机制到本地AI推理工具评估实战

GitHub日榜项目怎么选?从热榜机制到本地AI推理工具评估实战

1. 日榜项目到底在选什么:从热榜机制说起很多人第一次接触 GitHub 热榜,会以为它是一个"按 star 总数排序"的榜单,其实不是。日榜的核心逻辑是增量,也就是过去 24 小时内新增 star 的速度。一个总 star 数只有几百的新项…

2026/10/11 23:37:43 阅读更多 →
ScreenToGif使用指南:免费开源录屏工具,一站式制作GIF动图

ScreenToGif使用指南:免费开源录屏工具,一站式制作GIF动图

做自媒体、写技术文档、提bug、做教程的朋友,几乎都逃不过一个需求:把屏幕上的一段操作录成 GIF。截图不够直观,录视频又太整,动图恰好卡在中间,既能在文档里内嵌,又能在聊天窗口直接播放。我用过不少工具&…

2026/10/11 23:37:43 阅读更多 →
表格大模型的回溯思考引擎:让预测可追溯、可干预、可审计

表格大模型的回溯思考引擎:让预测可追溯、可干预、可审计

1. 项目概述:这不是又一个“微调大模型”的故事,而是给结构化数据装上“回溯思考引擎”你有没有遇到过这样的场景:某公司用一个训练好的表格大模型预测客户流失概率,结果模型给出0.87的高分预警,但业务负责人盯着屏幕发…

2026/10/11 23:36:42 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →