SQL实现日期自动填充

简介: 在不同数据库用SQL实现日期自动填充的方法

SQL实现日期自动填充

在使用SQL进行数据处理时,经常会遇到需要补齐日期的需求,今天聊一聊几个主流数据库的实现方式。

下面以生成2021-09-01到2021-09-30之间所有日期为例进行说明

Oracle

connect by的递归查询还是比较强大的,实现起来也比较简单

SELECT TO_DATE('2021-08-31', 'yyyy-mm-dd') + ROWNUM as date_list
FROM DUAL
CONNECT BY ROWNUM <= 30;

MySQL

  • 在MySQL8之前的版本,通过先生成序号列表,再使用起始日期增加相应天数来实现
SELECT date_add('2021-09-01', INTERVAL d_num DAY) date_list
FROM (
-- 使用@变量的形式,得到序号列表
SELECT @num := @num + 1 as d_num
from
-- 通过两个临时表做笛卡尔积,得到一个记录数为两个表乘积的数据
-- 此处为5*6=30天
(SELECT 1 UNION SELECT 2 UNION 
 SELECT 3 UNION SELECT 4 UNION SELECT 5) t1,
    
(SELECT 1 UNION SELECT 2 UNION SELECT 3
 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) t2,
-- 声明从-1开始
(SELECT @num := -1) a
) a
  • 在MySQL8以后,可以通过递归语法实现
WITH RECURSIVE cte (d) AS
(SELECT '2021-09-01'
 UNION ALL
 SELECT d + INTERVAL 1 DAY
 FROM cte
 WHERE d + INTERVAL 1 DAY <= '2021-09-30')
SELECT *
FROM cte
ORDER BY cte.d;

PostgreSQL

实现起来比较简单粗暴,直接使用generate_series函数生成

select generate_series(
    '2021-09-01'::date,
    '2021-09-30',
    '1 day') date_list;

Hive 函数

在Hive上面的实现相对复杂一些,实现思路是构建出起始日期需要增加天数,然后使用起始日期增加相应的天数实现日期补齐

  1. 使用datediff计算起始日期与结束日期的日期差的天数n
  2. 使用repeat生成一个字符串s,字符串内容为重复某字符n遍
  3. 使用split将字符串s拆分成数组a
  4. 使用posexplode将数组a转为n行带序号的数据

    posexplode说明:behaves like explode for arrays, but includes the position of items in the original array
  5. 通过date_add函数,从起始日期加上序号达到日期补齐

注:本SQL是在Hive3.1.2中执行

select date_add('2021-09-01', a.pos) as d
from (select posexplode(
    split(
        repeat('m', 29)
      , 'm')
)) a
目录
相关文章
|
SQL BI 数据库
达梦(DM) SQL日期操作及分析函数
讲述DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理
|
SQL Serverless 数据库
|
1月前
|
SQL 开发框架 .NET
sql server日期时间函数
sql server日期时间函数
36 2
|
1月前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
3月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
95 0
|
3月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
374 0
|
4月前
|
SQL 数据处理
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
|
6月前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
232 0
|
6月前
|
SQL 索引
SQL日期函数
SQL日期函数
64 0
|
6月前
|
SQL 关系型数据库 MySQL
sql查询指定日期前n天数据
sql查询指定日期前n天数据