在常用数据库中生成日期序列(数据库中日期的类型)
ztj100 2025-05-03 17:52 25 浏览 0 评论
根据所使用的关系数据库管理系统 (RDBMS),可以使用不同的方法在两个特定日期之间生成日期序列。我将提供一些流行的RDBMS系统的示例:MySQL,PostgreSQL和Microsoft SQL Server。
请注意,语法可能会因您使用的 RDBMS 的特定版本而略有不同,因此,如果遇到任何问题,应查阅特定版本的文档。
MySQL
旧版 MySQL (5.7.*)
旧的 MySQL 没有生成日期序列的内置函数,因此您可能需要使用临时表或数字表。下面是使用数字表方法的示例:
CREATE TEMPORARY TABLE Numbers (n INT);
-- Insert numbers up to the desired range
INSERT INTO Numbers VALUES (0), (1), (2), ...;
SELECT
DATE_ADD('start_date', INTERVAL n DAY) AS generated_date
FROM Numbers
WHERE
DATE_ADD('start_date', INTERVAL n DAY) <= 'end_date';
只需将“start_date”和“end_date”替换为您想要的开始和结束日期,然后在 SQLize.online 上尝试即可。
在现代MySQL 8.0.*中,您可以使用公用表表达式(CTE)在两个特定日期之间生成日期序列。以下是您可以做到这一点的方法:
SET @start_date = '2022-01-01';
SET @end_date = '2022-01-31';
WITH RECURSIVE DateSeries AS (
SELECT @start_date AS generated_date
UNION ALL
SELECT DATE_ADD(generated_date, INTERVAL 1 DAY)
FROM DateSeries
WHERE generated_date < @end_date
)
SELECT generated_date
FROM DateSeries;
解释:
- WITH 递归子句定义了名为 DateSeries 的 CTE。
- 在 CTE 中的初始 SELECT 语句中,我们将锚点值设置为开始日期。
- 在递归 SELECT 语句中,我们使用 DATE_ADD 函数将每次迭代的日期递增一天。
- 递归 SELECT 语句中的 WHERE 子句可确保递归继续,直到生成的日期小于结束日期。
- 最后,外部 SELECT 语句从 CTE 中选择所有生成的日期。
请记住,递归查询可能会占用大量资源,因此请谨慎使用它们,并且仅在必要时使用它们。在此处尝试查询
PostgreSQL
PostgreSQL具有generate_series功能,使这项任务变得容易:
SELECT generate_series('2022-01-01'::date, '2022-01-31'::date, '1 day') AS generated_date;
将“start_date”和“end_date”替换为所需的开始和结束日期。
Microsoft SQL Server
SQL Server也有类似的方法,使用sys.dates系统表和DATEADD函数:
DECLARE @start_date DATE = '2022-01-01'
DECLARE @end_date DATE = '2022-01-31'
SELECT TOP
(DATEDIFF(day, @start_date, @end_date) + 1)
generated_date = DATEADD(day, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @start_date)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
由于 SQL Server 2022 实现了函数,您也可以以以下方式将其用于生成日期系列:GENERATE_SERIES
SELECT
DATEADD(day, value, '2022-01-01') AS Date
FROM GENERATE_SERIES(0, DATEDIFF(day, '2022-01-01', '2022-01-31'))
神谕
SELECT DATE '2022-01-01' + LEVEL - 1 AS generate_series
FROM dual
CONNECT BY LEVEL <= DATE '2022-01-31' - DATE '2022-01-01' + 1
另一种很酷的方法:
SELECT TRUNC (DATE '2023-01-01' + ROWNUM) dt
FROM DUAL CONNECT BY ROWNUM < 31
如果您知道更多在不同RDBMS中获取日期序列的方法,请在评论中发布
相关推荐
- 新手学Docker:挂载卷Volumes(docker挂载nfs卷)
-
默认情况下,在容器内创建的文件,都会保存在容器基于镜像之上的一个可读写层。但是,这一层是依赖于容器而存在的,当容器不存在时,这些数据也就不存在了。而且这些数据紧紧的耦合在容器内部,很难将这些数据导出。...
- Docker命令最全详解(39个最常用命令)
-
Docker是云原生的核心,也是大厂的必备技能,下面我就全面来详解Docker核心命令@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc一、Docker基本命令...
- 松勤软件测试:详解Docker,如何用portainer管理Docker容器
-
镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...
- 【Docker 新手入门指南】第十四章:Docker常用命令
-
以下Docker常用命令大全,涵盖容器、镜像、网络、数据卷及系统管理等核心操作,结合分类与示例助你快速掌握:一、容器生命周期管理...
- Docker 一键清盘术,释放磁盘空间不求人
-
在日常开发和运维中,Docker容器化让我们的工作更高效,但不知不觉中,磁盘空间却被镜像、容器和卷悄悄吃掉。今天教你一套干净利落的Docker磁盘清理攻略,让你轻松腾出宝贵空间!一、快速查看磁盘...
- 第六节 Docker 容器核心操作与实践指南
-
一、镜像与容器的本质关系(一)镜像(Image)的核心特性静态模板:包含应用运行所需的所有依赖(系统库、运行时、配置文件等)不可变性:镜像构建完成后内容不可修改,确保环境一致性...
- 别再去找Docker命令了,你要的常用的全都在这
-
Docker常用命令集合给大家介绍一些常用的Docker命令,对你有帮助的同学建议收藏作为一个查询手册哦。Docker容器的一些命令按功能分类大致如下:Docker环境信息info、versio...
- Docker 数据持久化最佳实践:Volume 使用全指南
-
你是不是也经常在使用Docker的时候,遇到“数据持久化”相关的困惑?容器删了,数据也跟着没了?今天就带你深入了解Docker的Volume机制,搞懂什么是Volume、怎么使用、存储在...
- 【Docker 新手入门指南】第十五章:常见故障排除
-
一、前期准备:收集关键信息在排查问题前,建议先获取以下系统数据,便于精准定位故障:...
- Docker网络与iptables实战指南:从原理到安全加固
-
一、Docker网络核心原理:容器与iptables的“共生关系”Docker容器的网络能力依赖于Linux内核的两大核心技术:虚拟网络设备(vethpair、网桥)和iptables规则链。以默认...
- 别再docker exec了!盘点进入容器排错的5种“更优雅”姿势
-
一、dockerattach:直接“附身”容器的原始方法当容器日志疯狂刷屏时,dockerattach就像直接跳进正在行驶的汽车——能看到仪表盘数据,但方向盘不在你手上。这种直接附加到容器主进程的...
- 云计算核心技术Docker教程:Docker数据卷的使用
-
在生产环境中使用Docker,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束)或者需要在多个容器之间进行数据共享,需要将数据从宿主机挂载到容器中,这就会...
- 【开发技术】Mybatis中进行多表关联查询?性能是不是会变好呢?
-
Mybatis是一种基于Java的持久层框架,能够帮助我们操作数据库。在Mybatis中,进行多表关联的整合查询,需要使用嵌套查询或者使用ResultMap进行映射。下面,我们将从这两个方面来介绍多表...
- Mybatis 批量更新数据 Mysql批量更新数据
-
通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据1批量更新相同的值不同的条件...
- Mybatis 如何批量删除数据(mybatis批量merge)
-
Mybatis如何批量删除数据本期以最常用的根据id批量删除数据为例:接口设计1:List类型单参数IntegerdeleteByIds(List<Integer>ids);...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)