sql小技巧:日期区间和格式化操作 您所在的位置:网站首页 sql语句格式化日期 sql小技巧:日期区间和格式化操作

sql小技巧:日期区间和格式化操作

2024-07-12 09:51| 来源: 网络整理| 查看: 265

sql小技巧 日期区间和格式化操作

根据不同的日期要求取得数据

主要是对聚合函数 DATEADD()、DATESUB() 和关键字 interval的使用

筛选指定时间半年

思路: 其实就是用当前时间减去五个月

SELECT date,user_id FROM TABLENAME WHERE from_unixtime(timestamp / 1000) >= DATE_SUB(CURDATE(), interval 5 month)

筛选指定时间往前 n 天

思路: 依旧是对时间的计算上做手脚 ,但是要记得控制左右边界 不然会出现查询数据缺失和混乱问题 如

from_unixtime({指定时间} / 1000)+INTERVAL 1 DAY - INTERVAL 1 SECOND

如果直接使用当前时间 获取的时候是 23-9-27 00:00:00 这个时候当前就不算在范围内了,我们需要利用 INTERVAL 1 DAY - INTERVAL 1 SECOND 取到 23-9-27 23:59:59

保证数据正常显示

SELECT date,user_id FROM TABLENAME WHERE from_unixtime(timestamp / 1000) >= DATE_SUB(from_unixtime({指定时间} / 1000), interval 20 day) AND from_unixtime({指定时间} / 1000)+INTERVAL 1 DAY - INTERVAL 1 SECOND >= from_unixtime(`timestamp`/ 1000)

取出指定时间 n周的 第一天 作为本周的数据头

函数说明:

timestamp / 1000:将时间戳除以1000,转换为秒数。from_unixtime():将秒数转换为Unix时间戳。date_sub():计算指定时间减去的时间间隔。dayofweek(from_unixtime(timestamp / 1000)) - 2 day:计算指定时间的星期几减去2天,用于计算日期偏移量。DATE_FORMAT():将日期格式化为指定的格式,其中%Y表示年份,%c表示月份的英文缩写,%d表示日期。

使用 dayofweek 拿到当前时间的本周第一天并且重写格式

SELECT DATE_FORMAT(date_sub(from_unixtime(timestamp / 1000), interval dayofweek(from_unixtime(timestamp / 1000)) - 2 day), '%Y%c%d') AS date , user_id FROM TABLENAME WHERE from_unixtime(timestamp / 1000) >= date_sub(from_unixtime(#{指定时间} / 1000), interval 10 week)

指定天数每个小时段的数据

看着sql 长, 其实就是对数据的时间的格式化,通过时分秒去判断边界

SELECT DATE_FORMAT(from_unixtime(timestamp / 1000), '%H') AS date, user_id:将时间戳转换为Unix时间戳后,再将其格式化为小时(24小时制),并命名为"date",同时选择用户ID列。

WHERE from_unixtime(timestamp / 1000) > str_to_date(...) AND DATE_ADD(...) > from_unixtime(timestamp / 1000)

:设置查询条件。

str_to_date(DATE_FORMAT(from_unixtime(${指定时间} / 1000), '%Y-%m-%d'), '%Y-%m-%d %H:%i:%s'):将指定时间(以秒为单位)转换为日期格式,并命名为"指定时间"。DATE_ADD(str_to_date(...), INTERVAL 1 DAY):在指定时间上添加1天的时间间隔。DATE_ADD(..., INTERVAL -1 SECOND):在上一步的结果上再减去1秒的时间间隔。> from_unixtime(timestamp / 1000):筛选出时间戳大于上一步结果的时间戳。 SELECT DATE_FORMAT(from_unixtime(timestamp / 1000), '%H') AS date , user_id FROM TABLENAME WHERE from_unixtime(timestamp / 1000) > str_to_date(DATE_FORMAT(from_unixtime(${指定时间} / 1000), '%Y-%m-%d'), '%Y-%m-%d %H:%i:%s') AND DATE_ADD( DATE_ADD(str_to_date(DATE_FORMAT(from_unixtime(${指定时间} / 1000), '%Y-%m-%d'), '%Y-%m-%d %H:%i:%s'), INTERVAL 1 DAY), INTERVAL -1 SECOND) > from_unixtime(timestamp / 1000)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有