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='日期時間')

  

總結:積累這么多,如果有錯的請多多提醒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM