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 3UNION 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 ALLSELECT d + INTERVAL 1 DAYFROM cteWHERE 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实现日期自动填充相关推荐

  1. mpp新增一个字段_mybatisplus使用@InsertFill和@UpdateFill注解设置自定义sql对字段自动填充...

    自动填充优化功能 原生mybatisplus只能做%s+1和now两种填充,mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充. 需要在实体类字段上用原生注解@Table ...

  2. python写下拉列表在excel_用python处理excel数据(四)实现excel表下拉自动填充

    我有这样一张excel表,id 实现自动填充,库存 实现隔行yes 否则no,日期自动填充 1.先读取excel import pandas as pd edexcel=pd.read_excel(' ...

  3. html 自动填充 颜色,周六周日行自动填充颜色

    EXCEL如何设置条件格式使表格中代表周六日的列自动比如 列 A B C D E F G H I J K L M N O P Q R S 日期 1 2 3 4 5 6 7 8 打开一个空白excel表 ...

  4. sql server 按照日期自动生成单据编号的函数

    一.sql server 按照日期自动生成单据编号的函数,格式为##08080001,##表示打头的单据字符,然后是年月和流水编号. 二.传入的参数为单据的打头字符和生成单据的日期 三.一般的调用格式 ...

  5. MS SQL Server 2000 按日期自动备份

    MS SQL Server 2000 按日期自动备份 ms sql server 2000 1.管理-作业-步骤-命令 DECLARE @strPath NVARCHAR(200)  set @str ...

  6. sql导入数据以及列表编号设置自动填充

    将excel表格直接导入到sql server中 如何利用图形界面设置编号进行自动填充递增 如何利用代码设置编号进行自动填充递增 create table 一个种子(编号 int identity(1 ...

  7. excel日期怎么间隔填充_系列或相同日期的自动填充Excel日期

    excel日期怎么间隔填充 If you're entering dates on an Excel worksheet, you don't have to enter each date indi ...

  8. html 自动输入日期,Js日期选择自动填充到输入框(界面漂亮兼容火狐)

    很漂亮.兼容火狐的Js日期选择,自动填充到输入框 body{font-size:12px;font-family:Verdana,Arial,"宋体";} a:link {colo ...

  9. asp按时间自动递增编号_Excel自动填充日期与每次递增3分钟的时间且批量生成编号,用快捷键填充当前日期...

    在 Excel 中,除数字可以自动填充外,日期和时间也可以自动填充:其中日期可按日.月.年和工作日填充,时间可按每次递增时分秒填充.日期填充方法有三种,一种是用拖动的办法自动填充,第二种是用双击单元格 ...

最新文章

  1. Flask-Email中的mail.record_messages()使用方法和实现
  2. Android LayoutInflater原理分析,带你一步步深入了解View(一)
  3. 2014 年编程语言排名,人人都爱 TypeScript
  4. SQLite安装、编译与应用
  5. 读书笔记:《图解HTTP》第一章 网络基础
  6. linux学习笔记-第六课-/etc/passwd,/etc/shadow,useradd,su,sudo等
  7. Netflix Archaius用于物业管理–基础知识
  8. 常用sql操作语句实战演示
  9. oracle 闪查询,Oracle的回闪查询
  10. java中位于集合框架顶层位置的是,CoreJava第二次内测有答案
  11. 使用VSCode时,执行ng serve出错
  12. 计算机开关机命令,电脑自动关机命令
  13. QTcpSocket网络通讯多客户端功能
  14. ajax几种回调函数
  15. Whois 信息与个人隐私
  16. Mac剪切AVI视频
  17. 基于SWTC公链的融媒体项目入选工信部网络安全示范项目
  18. /dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final
  19. 支付宝,微信,线上支付流程介绍
  20. 2018年用户体验设计的10个趋势

热门文章

  1. 【电子学会】2021年12月图形化三级 -- 分身术
  2. IBM的LPI复习资料之LPI101-Topic102:Linux安装和包管理(1)硬盘分区
  3. DirectUI界面编程(四)界面布局详解
  4. 比 SpringBoot 更快、更轻、更小!
  5. 笔记本PS/2键盘无法使用,试下这个方法
  6. html js 点击隐藏div,javascript实现显示和隐藏div方法汇总
  7. 8位、16位和32位的MCU,更多的位是更好的吗?
  8. 创业指导 创业搭档的性格配方案
  9. 厦门达内培训python多少钱
  10. 关于魏则西事件一点感触