Django的ORM和SQL分别按时间查询数据
在日常工作中经常需要根据时间条件去查询数据,比如多少分钟之前、周几、当天、本月、今年等等,总结Django和sql的查询方法,分享下
1、获取5分钟前的数据
#sql方法 select * from 表名 where 时间字段名 >=DATE_SUB(NOW(),INTERVAL 5 MINUTE); #django方法 import datetime old_time = datetime.datetime.now() + datetime.timedelta(minutes=-5) modles.table_name.objects.filter(时间字段名__gt=old_time)
2、获取昨天的数据
#sql方法 SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段名) = 1; #django方法 import datetime date = datetime.date() + timedelta(days=-1) # 昨天 modles.table_name.objects.filter(时间字段名=date)
3、查看当天的数据
#sql方法 select * from table_name where to_days(create_time) = to_days(now()); #django方法 import datetime current_date = datetime.datetime.now().date() modles.table_name.objects.filter(时间字段名=current_date)
4、查看本年数据
#sql方法 select * from 表名 where YEAR(时间字段名)=YEAR(NOW()); #django方法 import datetime modles.table_name.objects.filter(时间字段名=datetime.datetime.now().year)
5、查看本月数据
#sql方法 SELECT * FROM 表名 WHERE DATE_FORMAT(时间字段名, '%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') #django方法 import datetime modles.talbe_name.objects.filter(时间字段名__month=datetime.datetime.now().month)
6、查看本周数据
#sql方法 SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段名,'%Y-%m-%d')) = YEARWEEK(now()); #django方法 def get_current_week(): monday= datetime.date.today() one_day = datetime.timedelta(days=1) while monday.weekday() != 0: monday -= one_day return monday current_date = datetime.datetime.now() monday = get_current_week() current_week_count = modles.table_name.objects.filter(时间字段名__gte=monday)
7、查询时间范围
比如:查询10月10号到10月12号之间 #mysql方法 SELECT * FROM 表名 WHERE 字段 BETWEEN '2021-10-10 00:00:00' AND '2021-10-12 23:59:59.999999' #django方法 import datetime start_date = datetime.date(2021, 10, 10) end_date = datetime.date(2021, 10, 12) modles.table_name.objects.filter(时间字段名__range=(start_date, end_date))
8、查多少天以来的数据
比如查询两天以来 #sql方法: SELECT * FROM monitor_warn_message where DATE_SUB(CURDATE(), INTERVAL 2 DAY) <= date(create_time); #django方法: current_date = datetime.datetime.now() dt_e = datetime.datetime.now().date() dt_s = (dt_e - datetime.timedelta(2)) modles.table_name.objects.filter(create_time__range=[dt_s,dt_e])
9、查询某年
比如:查询2020 #sql方法 SELECT * FROM `表名` WHERE 字段名 BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59.999999' #django方法 modles.table_name.objects.filter(时间字段名__year=2020)
10、查询某月
#sql方法 SELECT * FROM `monitor_warn_message` WHERE EXTRACT(MONTH FROM 时间字段名) = 月份; #django方法 modles.table_name.objects.filter(时间字段名__month=月份)
11、查询周几
比如查询周二,(默认从周日开始到周六1-7) #sql方法 SELECT * FROM `表名` WHERE DAYOFWEEK(时间字段名) = 3; #django方法 modles.table_name.objects.filter(时间字段名__week_day=3)
12、查询几号
查询几号 比如:查看每个月3号数据 #sql方法 SELECT * FROM `表名` WHERE EXTRACT(DAY FROM 时间字段名) = 3; #django方法 modles.table_name.objects.filter(时间字段名__day=3)
13、查看大于某个时间
#sql方法 select * from 表名 where 字段名 > '日期时间'; #django方法 modles.table_name.objects.filter(时间字段名__gt='日期时间')
14、查看小于某个时间
#sql方法 select * from 表名 where 字段名 < '日期时间'; #django方法 modles.table_name.objects.filter(时间字段名__lt='日期时间')
15、查看大于等于某个时间
#sql方法 select * from 表名 where 字段名 >= '日期时间'; #django方法 modles.table_name.objects.filter(时间字段名__gte='日期时间')
16、查看小于等于某个时间
#sql方法 select * from 表名 where 字段名 <= '日期时间'; #django方法 modles.table_name.objects.filter(时间字段名__lte='日期时间')
总结:积累这么多,如果有错的请多多提醒