Django笔记之数据库函数之日期函数

news2024/11/27 16:52:38

日期函数主要介绍两个大类,Extract() 和 Trunc()

Extract() 函数作用是提取日期,比如我们可以提取一个日期字段的年份,月份,日等数据

Trunc() 的作用则是截取,比如 2022-06-18 12:12:12,我们可以根据需求获取到日期 2020-06-18,或者更细粒度到时分秒

这次我们用到下面这个 model:

class Experiment(models.Model):
    start_datetime = models.DateTimeField()
    start_date = models.DateField(null=True, blank=True)
    start_time = models.TimeField(null=True, blank=True)
    end_datetime = models.DateTimeField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

我们还是将其放到 blog/models.py 下,相关的 migration 操作这里不多做介绍

  1. Extract()
  2. Trunc()

1、Extract()

这个函数接受日期时间字段名称,和查询的年、月、日、时、分、秒等作为参数,提取出相应的值以整数类型返回

日期类型字段包括:DateTimeField,DateField,TimeField
提取的类型列举如下:

  • year——年份
  • quarter——季度
  • month——月份
  • day——某日
  • week——周数,一年的第几周
  • weekday——周几,周日的值是1,周一是2,一直到周六是7
  • hour——小时
  • minute——分钟
  • second——秒数

首先创建测试用的数据:

from datetime import datetime
start = datetime(2015, 6, 15, 12, 30, 56)
end = datetime(2015, 7, 2, 17, 21, 43)

from blog.models import Experiment
Experiment.objects.create(
    start_datetime=start, start_date=start.date(),
    end_datetime=end, end_date=end.date())

新增字段获取开始时间的年份,周数,周几以及该天的小时数

from blog.models import Experiment
from django.db.models.functions import Extract

experiment = Experiment.objects.annotate(
    start_year=Extract('start_datetime', 'year'),
    start_week=Extract('start_datetime', 'week'),
    start_week_day=Extract('start_datetime', 'week_day'),
	start_hour=Extract('start_datetime', 'hour')
).get(id=1)

print(experiment.start_year)
print(experiment.start_week)
print(experiment.start_week_day)
print(exprtiment.start_hour)

搜索特定年份数据

Extract() 函数的用法也可以用于搜索特定的日期的某一项,比如某年,某月等

Experiment.objects.filter(start_datetime__year=Extract('end_datetime', 'year'))

具体到日期某一项的用法

前面介绍了 Extract() 函数的用法是,接收字段名和日期项,Django 同时提供了另一种简便的、比Extract()函数更具体的用法。

比如我们需要需要搜索年,可以直接使用函数为 ExtractYear()

搜索月,使用函数 ExtractMonth()等等。

每一种在我们上面可接收的参数都有其对应的函数,传参为需要处理的字段,以下是使用示例:

from blog.models import Experiment
from django.db.models.functions import ExtractYear, ExtractWeek
expriment = Experiment.objects.annotate(
    start_year=ExtractYear('start_datetime'),
    start_week=ExtractWeek('start_datetime')
).get(id=1)

print(expriment.start_year)
print(expriment.start_week)

如果是周数、时、分、秒的操作,函数名将上面的年月日的英文替换即可

2、Trunc()

这是一个对日期和时间截取的函数,我们可以将时间精确到 年、季度、月、日、时、分、秒

接受三个参数:

  • expression: 字段,可以是 DateField, DateTimeField, TimeField 等
  • kind: 精确到的程度,可以是 year,day,quarter等
  • output_field: 输出格式,可以根据 kind 的值设置到最小值,如果不传这个参数,则默认是expression 的值

假设一个日期时间为 2022–05-16 12:34:56

我们可以挨个处理一下:

# 创建数据
from datetime import datetime
start_datetime = datetime(year=2022, month=5, day=16, hour=12, minute=34, second=56)

Experiment.objects.create(start_datetime=start_datetime)

from django.db.models.functions import Trunc
from django.db import models

experiment = Experiment.objects.annotate(
    start_year=Trunc('start_datetime', 'year', output_field=models.DateField()),
    start_quarter=Trunc('start_datetime', 'quarter', output_field=models.DateField()),
    start_month=Trunc('start_datetime', 'month', output_field=models.DateField()),
    start_day=Trunc('start_datetime', 'day', output_field=models.DateField()),
    start_hour=Trunc('start_datetime', 'hour', output_field=models.DateTimeField()),
    start_minute=Trunc('start_datetime', 'minute', output_field=models.DateTimeField()),
    start_second=Trunc('start_datetime', 'second', output_field=models.DateTimeField()),
).get(id=2)

然后挨个 print() 他们的结果如下:

>>> print(experiment.start_year)
2022-01-01
>>> print(experiment.start_quarter)
2022-04-01
>>> print(experiment.start_month)
2022-05-01
>>> print(experiment.start_day)
2022-05-16
>>> print(experiment.start_hour)
2022-05-16 12:00:00+00:00
>>> print(experiment.start_minute)
2022-05-16 12:34:00+00:00
>>> print(experiment.start_second)
2022-05-16 12:34:56+00:00

需要注意的是,截取到年、月、季度的数据,因为不关心当前时间刻度之下的数据,所以日期的日,都会被置为1,时间都会是0

从输出的结果看,日期时间都精确到了我们设置的细度,那么我们就可以利用这个来进行年度、月度、季度、以及日度等一些数据的统计

接下来以日度数据为例,我们做一下统计,统计每一天的数据的数量:

from django.db.models import Count
Experiment.objects.annotate(start_day=Trunc("start_datetime", "day", output_field=models.DateField())).values("start_day").annotate(count_day=Count("id"))

与 Extract() 函数类似,Trunc() 函数也有一些可以直接操作到时间的函数,比如 TruncYear(), TruncMonth() 这种,这里就不展开介绍了。

以上就是本篇笔记全部内容,下一篇将介绍数据库函数里计算公式相关函数。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/867104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习基础知识笔记

深度学习要解决的问题 1 深度学习要解决的问题2 应用领域3 计算机视觉任务4 视觉任务中遇到的问题5 得分函数6 损失函数7 前向传播整体流程8 返向传播计算方法1 梯度下降9 神经网络整体架构 11 神经元个数对结果的影响12 正则化和激活函数1 正则化2 激活函数 13 神经网络过拟合…

人工智能可解释性(二)(梯度计算,积分梯度等)

目录 1.定义 2.详述 2.1局部解释 可视化方法 梯度计算 2.2积分梯度Integrated Gradients(梯度计算进阶) 2. 3全局解释 2.3.1Activation Maximization 2.3.2GAN,VAE 2. 4用一个可解释模型解释不可解释模型 2. 4.1LIME 局部解释 参考文献 1.定义 可…

access怎么做进销存?借助access开发进销存管理应用

我不太推荐使用Access,因为他的缺点还是比较明显的: 1、软件自身限制 不能用于互联网:使用Access制作好的管理软件,访问页只能在局域网中使用;只能在Windows上运行:Access仅支持windows的运行环境&#x…

从零开始学习 Java:简单易懂的入门指南之多态(十)

多态&包&final&权限修饰符&代码块 第一章 多态1.1 多态的形式1.2 多态的使用场景1.3 多态的定义和前提1.4 多态的运行特点1.5 多态的弊端1.6 引用类型转换1.6.1 为什么要转型1.6.2 向上转型(自动转换)1.6.3 向下转型(强制转换…

【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

积分代换和周期函数

昨晚上看书,有一个稳定随机过程的例题,涉及积分上下限代换、周期函数的微积分性质等知识点。这种题型以前肯定接触过,当下遇到了,思维仍然迷迷糊糊,像是一团乱麻,纠缠不清,照着答案思考了半天&a…

[Blender]Geometry nodes altermesh to UE

首先要先下载插件 AlterMesh – Use geometry nodes inside Unreal 下载对应版本的插件后 打开UE,在对应的设置里面挂上blender.exe的路径 去官方下载一个Blender Geometry nodes 的示例 Demo Files — blender.org​​​​​​

沃罗诺伊图(Voronoi):迷人的世界【1/2】

一、说明 Voronoi图(也称为狄利克雷镶嵌或泰森多边形)在自然界中无处不在。你已经遇到过他们数千次了,但也许没有这样称呼它。Voronoi图很简单,但它们具有令人难以置信的特性,在制图,生物学,计算…

【EI/SCOPUS征稿】第九届材料加工与制造工程国际学术会议(ICMPME 2023)

第九届材料加工与制造工程国际学术会议 2023 9th International Conference on Materials Processing and Manufacturing Engineering (ICMPME 2023) 第九届材料加工与制造工程国际学术会议(ICMPME 2023)定于2023年10月13-15日在中国南昌隆重举行。会议主要围绕“材料加工”、…

c++11 标准模板(STL)(std::basic_fstream)(五)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_fstream : public std::basic_iostream<CharT, Traits> 类模板 basic_fstream 实现基于文件的流上的高层输入/输出。它将 std::basic_i…

【Linux从入门到精通】文件描述符详解

文章目录 一、引言 二、引入文件描述符fd 2、1 观察fd的值 2、2 fd保存的位置 三、详解文件描述符fd 3、1 为什么要有文件描述符呢 3、2 到底什么是文件操作符呢 四、文件描述符的使用 4、1 验证文件描述符 4、1、1 验证stdin、stdout、stdout 4、1、2 验证fd值的大小顺序 4、…

IMU惯性测量单元相关技术(概念版)

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 新手入门系列3——Allan方差分析方法的直观理解 惯性测量单元Allan方差分析详解 IMU误差&测量模型 IMU标定之—Allan方差 IMU误差模型简介及VINS…

2023年中国日志审计市场竞争格局、市场规模、下游应用领域及行业发展趋势[图]

日志是行为或状态详细描述的载体&#xff0c;其时效性与信息丰富程度在网络安全事件分析、事件回溯和取证过程中起到重要作用。在法律层&#xff0c;日志也是重要的电子证据&#xff0c;日志记录、监控、审计手段等&#xff0c;可以帮助有效地减少信息破坏、信息泄露的问题&…

2023最新python学习方法总结!(内部机密)

不要再问我python好不好学了 我之前做过半年少儿编程老师&#xff0c;一个小学四年级的小孩子都能在我的教学下独立完成python游戏&#xff0c;植物大战僵尸简单版&#xff0c;如果要肯花时间&#xff0c;接下来的网络开发也不是问题&#xff0c;人工智能也可以学个调包也没啥问…

【TypeScript】this指向,this内置组件

this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…

PLY模型格式详解【3D】

本文介绍PLY 多边形文件格式&#xff0c;这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式&#xff1a;易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 …

多线程与高并发--------线程

一、线程的基础概念 一、基础概念 1.1 进程与线程 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 什么线程&am…

JAVA(一)

我的第一个JAVA程序 以下我们通过一个简单的实例来展示Java编程,创建文件HelloWorld.java&#xff08;文件名需与类名一致&#xff09;,代码如下 实例 public class HelloWorld{public static void main(String[] args){System.out.println(Hello World) } } 注:Srting ar…

[NLP]LLM 训练时GPU显存耗用量估计

以LLM中最常见的Adam fp16混合精度训练为例&#xff0c;分析其显存占用有以下四个部分&#xff1a; GPT-2含有1.5B个参数&#xff0c;如果用fp16格式&#xff0c;只需要1.5G*2Byte3GB显存, 但是模型状态实际上需要耗费1.5B*1624GB. 比如说有一个模型参数量是1M&#xff0c;在…

RCNA——VLAN进阶划分

一&#xff0c;实验背景 有时&#xff0c;公司可能会非常大&#xff0c;因为业务需求的因素&#xff0c;所以每个部门在每一个楼层都有相应的办公室&#xff0c;因此想要实现他们之间的互连互通&#xff0c; 可以在每个楼层部署一个楼层交换机&#xff0c;实现各个楼层相同部门…