datediff 与 date_format 性能对比

本文探讨了在数据量超过400万条的情况下,使用datediff与date_format两种方法查询特定日期数据的效率比较。结果显示,datediff方法稍快。

 最近有个功能需要查询数据库中某天内的数据,而数据的时间是timestamp 格式,这样我在查询时,就有2中选择

select * from tuples where datediff(created_on,'2008-07-09')=0
select * from tuples where date_format(created_on,'%Y-%m-%d')='2008-07-09'

数据库中的数据量很大,超过400万条。对比了下执行时间

 

 

Showing rows 0 - 29 (175 total, Query took 0.0009 sec)
Showing rows 0 - 29 (175 total, Query took 0.0012 sec)

 

从结果来看,他们相差不大,两种都可接受。datediff似乎效率好点!

SELECT CONCAT(YEAR(a.GzRq), '-W', LPAD(WEEK(a.GzRq, 1), 2, '0')) AS GzWeek, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY AS WeekStartDate, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY AS WeekEndDate, CASE WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 0 AND 6 THEN CONCAT('本周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 7 AND 13 THEN CONCAT('过去第1周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 14 AND 20 THEN CONCAT('过去第2周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 21 AND 27 THEN CONCAT('过去第3周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 28 AND 34 THEN CONCAT('过去第4周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 35 AND 41 THEN CONCAT('过去第5周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 42 AND 48 THEN CONCAT('过去第6周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 49 AND 55 THEN CONCAT('过去第7周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 56 AND 62 THEN CONCAT('过去第8周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 63 AND 69 THEN CONCAT('过去第9周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 70 AND 76 THEN CONCAT('过去第10周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 77 AND 83 THEN CONCAT('过去第11周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 84 AND 90 THEN CONCAT('过去第12周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') WHEN DATEDIFF(CURRENT_DATE, DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY) BETWEEN 91 AND 97 THEN CONCAT('过去第13周(', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY, '%Y-%m-%d'), ' - ', DATE_FORMAT(DATE_FORMAT(a.GzRq, '%Y-%m-%d') - INTERVAL WEEKDAY(a.GzRq) DAY + INTERVAL 6 DAY, '%Y-%m-%d'), ')') ELSE '历史周' END AS WeekLabelWithDate, a.YjFlDm, a.YjFl, a.YjKs, a.ExamType, a.CheckFl, SUM(a.Kd_Cnt) AS Kd_Cnt, SUM(a.Kd_Jf_Cnt) AS Kd_Jf_Cnt, SUM(a.Yy_Dt_Cnt) AS Yy_Dt_Cnt, SUM(a.Yy_Gt_Cnt) AS Yy_Gt_Cnt, SUM(a.Yy_Cnt1) AS Yy_Cnt1, SUM(a.Yy_Cnt2) AS Yy_Cnt2, SUM(a.Yy_Cnt3) AS Yy_Cnt3, SUM(a.Yy_Cnt4) AS Yy_Cnt4, SUM(a.ZdYy_Xm_Cnt) AS ZdYy_Xm_Cnt, SUM(a.Kd_Wc_Cnt) AS Kd_Wc_Cnt, SUM(a.Kd_Wc_Cnt1) AS Kd_Wc_Cnt1, ROUND(SUM(a.Time1_Wc_Num) / NULLIF(SUM(a.Time_Wc_Den), 0), 4) AS Time1_Wc_Rate, ROUND(SUM(a.Time2_Wc_Num) / NULLIF(SUM(a.Time_Wc_Den), 0), 4) AS Time2_Wc_Rate, ROUND(SUM(a.Time3_Wc_Num) / NULLIF(SUM(a.Time_Wc_Den), 0), 4) AS Time3_Wc_Rate, ROUND(SUM(a.Time4_Wc_Num) / NULLIF(SUM(a.Time_Wc_Den), 0), 4) AS Time4_Wc_Rate, ROUND(SUM(a.Time5_Wc_Num) / NULLIF(SUM(a.Time_Wc_Den), 0), 4) AS Time5_Wc_Rate, ROUND(SUM(a.Time6_Wc_Num) / NULLIF(SUM(a.Time_Wc_Den), 0), 4) AS Time6_Wc_Rate, SUM(a.Dj_Wjc_Cnt) AS Dj_Wjc_Cnt, SUM(a.Jc_Wbg_Cnt) AS Jc_Wbg_Cnt, SUM(a.Yy_Wc_Cnt) AS Yy_Wc_Cnt, ROUND(SUM(a.Yy_Wc_Num) / NULLIF(SUM(a.Yy_Wc_Den), 0), 4) AS Yy_Wc_Rate, IFNULL(SUM(c.OpenSl_Cnt), 0) AS OpenSl_Cnt, IF(IFNULL(SUM(c.OpenSl_Cnt), 0) - IFNULL(SUM(b.Yy_cnt), 0) < 0, 0, IFNULL(SUM(c.OpenSl_Cnt), 0) - IFNULL(SUM(b.Yy_cnt), 0)) AS KcSl_Cnt, IF(IFNULL(SUM(e.OpenSl_Cnt), 0) - IFNULL(SUM(d.Yy_cnt), 0) < 0, 0, IFNULL(SUM(e.OpenSl_Cnt), 0) - IFNULL(SUM(d.Yy_cnt), 0)) AS KcSl2_Cnt, SUM(a.Time1_Wc_Num) AS Time1_Wc_Num, SUM(a.Time2_Wc_Num) AS Time2_Wc_Num, SUM(a.Time3_Wc_Num) AS Time3_Wc_Num, SUM(a.Time4_Wc_Num) AS Time4_Wc_Num, SUM(a.Time5_Wc_Num) AS Time5_Wc_Num, SUM(a.Time6_Wc_Num) AS Time6_Wc_Num, SUM(a.Time_Wc_Den) AS Time_Wc_Den, SUM(a.Yy_Wc_Num) AS Yy_Wc_Num, SUM(a.Yy_Wc_Den) AS Yy_Wc_Den FROM dw2yj_kdyy_tj a LEFT JOIN ( SELECT o.RqDate, o.YzGnLxDm, o.PacsCheckFlID, SUM(o.YyRc) AS Yy_cnt FROM dw2yj_pacs_yy2 o WHERE o.RqDate >= CURRENT_DATE - INTERVAL 14 WEEK GROUP BY o.RqDate, o.YzGnLxDm, o.PacsCheckFlID ) b ON a.GzRq = b.RqDate AND a.YzGnLxDm = b.YzGnLxDm AND a.PacsCheckFlID = b.PacsCheckFlID LEFT JOIN ( SELECT p.Rq, p.YzGnLxDm, p.PacsCheckFlID, SUM(IFNULL(p.OpenSl, 0) + IFNULL(p.TmpOpenSl, 0)) AS OpenSl_Cnt FROM dw1mzyj_jc_yy_sl p WHERE p.Rq >= CURRENT_DATE - INTERVAL 14 WEEK AND p.KdQy NOT IN ('病区', '急诊', '住院', '体检') AND p.StopFlag = 0 GROUP BY p.Rq, p.YzGnLxDm, p.PacsCheckFlID ) c ON a.GzRq = c.Rq AND a.YzGnLxDm = c.YzGnLxDm AND a.PacsCheckFlID = c.PacsCheckFlID LEFT JOIN ( SELECT o.RqDate, o.YzGnLxDm, o.PacsCheckFlID, SUM(o.YyRc) AS Yy_cnt FROM dw2yj_pacs_yy2 o WHERE o.RqDate >= CURRENT_DATE - INTERVAL 14 WEEK GROUP BY o.RqDate, o.YzGnLxDm, o.PacsCheckFlID ) d ON a.GzRq = d.RqDate - INTERVAL 1 DAY AND a.YzGnLxDm = d.YzGnLxDm AND a.PacsCheckFlID = d.PacsCheckFlID LEFT JOIN ( SELECT p.Rq, p.YzGnLxDm, p.PacsCheckFlID, SUM(IFNULL(p.OpenSl, 0) + IFNULL(p.TmpOpenSl, 0)) AS OpenSl_Cnt FROM dw1mzyj_jc_yy_sl p WHERE p.Rq >= CURRENT_DATE - INTERVAL 14 WEEK AND p.KdQy NOT IN ('病区', '急诊', '住院', '体检') AND p.StopFlag = 0 GROUP BY p.Rq, p.YzGnLxDm, p.PacsCheckFlID ) e ON a.GzRq = e.Rq - INTERVAL 1 DAY AND a.YzGnLxDm = e.YzGnLxDm AND a.PacsCheckFlID = e.PacsCheckFlID WHERE a.GzRq >= CURRENT_DATE - INTERVAL 14 WEEK GROUP BY CONCAT(YEAR(a.GzRq), '-W', LPAD(WEEK(a.GzRq, 1), 2, '0')), a.YjFlDm, a.YjFl, a.YjKs, a.ExamType, a.CheckFl;将 SQL 中的 WeekLabelWithDate 字段修改为符合 ISO 周次标准并显示周一至周日的日期范围
最新发布
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值