sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月 数据

SQL语句如下:

  • 查询当天的所有数据
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW()) = 0
SELECT * FROM 表名 WHERE to_days(时间字段名) = to_days(now());
  • 查询昨天的所有数据
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=-1
SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段名) = 1
  • 查询未来第n天的所有数据
//当n为负数时,表示过去第n天的数据
SELECT * FROM 表名WHERE DATEDIFF(字段,NOW())=n
  • 查询未来n天内所有数据
//n天内
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<n AND DATEDIFF(字段,NOW())>=0
  • 查询出今天,年月日
SELECT DATE_SUB(CURDATE(), INTERVAL 0 DAY)
  • 几个小时内的数据
DATE_SUB(NOW(), INTERVAL 5 HOUR)
  • 7天
SELECT * FROM 表名 wher DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)
  • 近30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)
  • 本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
  • 上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1
  • 查询过去n天内所有数据
//包含当天
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<=0 AND DATEDIFF(字段,NOW())>-n
//不包含当天
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<0 AND DATEDIFF(字段,NOW())>-n


DATEDIFF函数说明:

DATEDIFF() 函数用于返回两个日期之间的天数。 语法:DATEDIFF(date1,date2) date1 和 date2
参数是合法的日期或日期/时间表达式。 注释:
1. 只有值的日期部分参与计算。
2. 当日期date1<date2时函数返回值为正数,date1=date2时函数返回值为0,date1>date2 时函数返回值为负数。
3. Mysql的DATEDIFF只有两个参数。SQL Server有三个参数,详细内容可见:SQL Date函数


参考资源链接:[MySQL按时间维度查询价格平均值:实时折线图数据准备](https://wenku.csdn.net/doc/6wr1u3p3su?utm_source=wenku_answer2doc_content) 在处理按日期维度计算商品价格平均值时,我们面临的主要挑战是如何生成日期序列,并在此基础上执行分组聚合。《MySQL按时间维度查询价格平均值:实时折线图数据准备》这本书为我们提供了处理这类问题的权威指导和实用技巧。 首先,为了解决7价格平均值的问题,我们需要创建一个从今天起往回推7的日期序列。这可以通过递归查询实现,配合使用DATE_ADD函数递减时间。接着,我们将生成的日期序列与价格记录进行左连接,并使用IFNULL函数处理缺失的数据,将缺失值替换为0。以下是实现该功能的SQL查询示例: ```sql -- 创建日期序列并计算7的价格平均值 SET @cdate = DATE_ADD(CURDATE(), INTERVAL 1 DAY); SELECT IFNULL(avg_price, 0) AS avg_price, date FROM ( SELECT @cdate := DATE_ADD(@cdate, INTERVAL -1 DAY) AS date FROM ( SELECT @cdate := DATE_ADD(CURDATE(), INTERVAL 1 DAY) FROM dual LIMIT 7 ) a ) date_seq LEFT JOIN ( SELECT AVG(price) AS avg_price, DATE(gmt) AS date FROM price_log WHERE gmt >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE(gmt) ) price_avg ON price_avg.date = date_seq.date; ``` 对于每5计算一次价格平均值的问题,我们需要首先确定一个月内每个5周期的起始和结束日期。这里可以利用CEILING函数和DATEDIFF函数来计算日期间隔,从而确定每个周期的起始日期。然后,再根据这个周期对价格进行分组并计算平均值。以下是实现该功能的SQL查询示例: ```sql -- 计算每5周期的一个月价格平均值 SELECT IFNULL(avg_price, 0) AS avg_price, gmt FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL interval_5_day * 5 DAY) AS gmt FROM ( SELECT CEILING(DATEDIFF(CURDATE(), gmt) / 5) AS interval_5_day FROM price_log WHERE gmt BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() GROUP BY CEILING(DATEDIFF(CURDATE(), gmt) / 5) ) subquery ) date_cycle LEFT JOIN ( SELECT DATE(gmt) AS gmt, AVG(price) AS avg_price FROM price_log WHERE gmt BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() GROUP BY DATE(gmt) ) price_avg ON DATE_SUB(CURDATE(), INTERVAL interval_5_day * 5 DAY) = gmt; ``` 通过上述两个查询,我们可以得到所需的日期序列和价格平均值,为绘制折线图提供数据支持。为深入理解这些查询的工作原理以及如何应用到其他类似问题,建议阅读《MySQL按时间维度查询价格平均值:实时折线图数据准备》一书,其中包含了更多细节和案例,可以帮助你掌握时间序列分析和数据可视化方面的知识。 参考资源链接:[MySQL按时间维度查询价格平均值:实时折线图数据准备](https://wenku.csdn.net/doc/6wr1u3p3su?utm_source=wenku_answer2doc_content)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值