日期清洗的sql函数

 

sql语言是postgressql。

函数只处理了

中国格式 : xxxx年-xx月-xx日

美国格式: mm/dd/yyyy, September 04,1991, September 1991, sept 04, 1991

uunix格式: yyyy/mm/dd, yyyy/mm, 1991-01-1, 1991-1 , 1991-01

其他格式可以自行添加

预期的日期格式是: 1991/1/1 。 不能有0,即1991/01/01 是失败的

函数返回的是: " ‘预期格式’,年,月"

一、主要使用的内置函数是:

1. instr( <start_position> ,'str1' , 'str2' , <times>) 。

查找str2在str1出现的位置。num是出现的次数,默认是1。例如num=2,就是str2在str1第二次出现的位置。start_position是起始的位置下标,默认是从头开始即 1。

若str2在str1找不到,则返回0

 instr('123456', '2')  -- 结果是: 2. 位置索引值是从1开始instr('123456', '2' , 2) -- 结果是0 , 因为2 只出现一次

2. substr(str1, start_position, <length> )

截取字符串, 从str1 的 start_position开始截取, 截取长度是 length。length不填就是截取到字符串的最右边。

例如 start_position=2, length=3,  str1= ‘’12345678‘’

substr('123456', 2, 3) -- 结果是: 234. 因为postgres是下标索引是1开始substr('123456', 1, 3) -- 结果是: 123. 因为postgres是下标索引是1开始
substr('123456', 0, 3) -- 结果是: 123. 0也当成1substr('123456', 2) -- 结果是: 23456.  长度值不填,默认就是截取到最右边

3.  regexp_like(str1,str2)

查看str1 是否 符合 规则 str2.

str2是正则表达式: ^ 表示开头 ,$ 表示结尾。/d 表示数字 0-9,[0-9]也是表达数字,可读性更好。 | 是或的意思。

'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])$') 的规则就是, 19xx,18xx, 20xx 。xx代表数字的任意值

4. split_part(str1, str2, index)

华为gauss DB(DWS)中的字符串切分函数。 可以使用你自己sql相似的函数。

将 str1 按照 str2 切分, 并取切分后结果集合的第几个值。

-- 将'1,2,3'用 ','切分, 并取切分后结果的第二个值。 
split_part('1,2,3' , ',' , 2) -- 结果是2

5. trim()

去除字符串收尾的空格,避免影响 split_part 以空格切分字符串。

6. month()

返回月值, 确保没有0 。 因为清洗的预期是不要0

二、日期清洗函数

-- 返回 'birthday,birthday_year,birthday_month'
CREATE OR REPLACE FUNCTION aml.f_get_date_str(birthday_str character varying(500))RETURNS character varyingLANGUAGE plpgsqlSTABLE NOT FENCED SHIPPABLE -- 华为gausDB DWS的独有, postgres不用
AS $$
DECLAREp_birthday_str VARCHAR2(500);text_var1 text;text_var2 text;text_var3 text;
BEGINSELECT CASE -- 处理只有年份数字的 1988 、1978 WHEN regexp_like (trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])$') > 0 then concat_ws(',', trim(birthday_str), trim(birthday_str), ' ')-- 处理1988/05/15 或 1988/5/15 , 或1988/5/5WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(\/)([1-9]|[0][1-9]|[1][0-2])(\/)([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])$') > 0 then concat_ws(',', year(birthday_str) || '/' || month(birthday_str) || '/' || day(birthday_str), year(birthday_str), month(birthday_str))-- 处理1988/05,1988/5 ,  确保 没有0开头, 所以调用year,month函数再组装WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(\/)([1-9]|[0][1-9]|[1][0-2])$') > 0 then concat_ws(',', year(trim(birthday_str) || '/01') || '/' || month(trim(birthday_str) || '/01'), year(trim(birthday_str) || '/01'), month(trim(birthday_str) || '/01'))-- 处理mm/dd/yyyyWHEN regexp_like(trim(birthday_str),'^([1-9]|[0][1-9]|[1][0-2])(\/)([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(\/)([1][8-9][0-9][0-9]|[2][0][0-9][0-9])$') > 0 then concat_ws(',', year(birthday_str) || '/' || month(birthday_str) || '/' || day(birthday_str), year(birthday_str), month(birthday_str))-- 处理mm/yyyy ,  确保 没有0开头, 所以调用year,month函数再组装WHEN regexp_like(trim(birthday_str),'^([1-9]|[0][1-9]|[1][0-2])(\/)([1][8-9][0-9][0-9]|[2][0][0-9][0-9])$') > 0 then concat_ws(',', year(replace(trim(birthday_str),'/','/01/')) || '/' || month(replace(trim(birthday_str),'/','/01/')), year(replace(trim(birthday_str),'/','/01/')), month(replace(trim(birthday_str),'/','/01/')))-- 处理中国格式,-- xxxx年xx月xx日,  -> yyyy/m/dWHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(年)([1-9]|[0][1-9]|[1][0-2])(月)([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(日)$') > 0then concat_ws(',', year(replace(replace(replace(birthday_str,'年','/'),'月','/'),'日','')) || '/' || month(replace(replace(replace(birthday_str,'年','/'),'月','/'),'日','')) || '/' || day(replace(replace(replace(birthday_str,'年','/'),'月','/'),'日','')), year(replace(replace(replace(birthday_str,'年','/'),'月','/'),'日',''))  , month(replace(replace(replace(birthday_str,'年','/'),'月','/'),'日','')))-- xxxx年xx月  -> yyyy/mWHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(年)([1-9]|[0][1-9]|[1][0-2])(月)$') > 0then concat_ws(',', year(trim(replace(replace(birthday_str,'年','/'),'月','/')) || '01') || '/' || month(trim(replace(replace(birthday_str,'年','/'),'月','/')) || '01') , year(trim(replace(replace(birthday_str,'年','/'),'月','/')) || '01' ) , month(trim(replace(replace(birthday_str,'年','/'),'月','/')) || '01') )-- xxxx年xx  -> yyyy/mWHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(年)([1-9]|[0][1-9]|[1][0-2])$') > 0then concat_ws(',', year(trim(replace(birthday_str,'年','/')) || '/01') || '/' || month(trim(replace(birthday_str,'年','/')) || '/01') , year(trim(replace(birthday_str,'年','/')) || '/01'), month(trim(replace(birthday_str,'年','/')) || '/01'))-- xxxx年WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(年)$') > 0then concat_ws(',', replace(birthday_str,'年',''), replace(birthday_str,'年',''), ' ' )-- 处理1988-05-15 或 1988-5-15 , 或1988-5-5WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(\-)([1-9]|[0][1-9]|[1][0-2])(\-)([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])$') > 0 then concat_ws(',', year(replace(birthday_str,'-','/')) || '/' || month(replace(birthday_str,'-','/')) || '/' || day(replace(birthday_str,'-','/')), year(replace(birthday_str,'-','/'))  , month(replace(birthday_str,'-','/')))-- 处理1988-05WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])(\-)([1-9]|[0][1-9]|[1][0-2])$') > 0 then concat_ws(',', year(trim(replace(birthday_str,'-','/')) || '/01') || '/' || month(trim(replace(birthday_str,'-','/')) || '/01'), year(trim(replace(birthday_str,'-','/')) || '/01')  , month(trim(replace(birthday_str,'-','/')) || '/01'))-- 处理19880515WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])([0][1-9]|[1][0-2])([0][1-9]|[1-2][0-9]|[3][0-1])$') > 0 then concat_ws(',', year(birthday_str) || '/' || month(birthday_str)  || '/' || day(birthday_str) , year(birthday_str), month(birthday_str))-- 处理198805,20xx05 , 补齐日的值 例如:01WHEN regexp_like(trim(birthday_str),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])([0][1-9]|[1][0-2])$') > 0 then concat_ws(',', year(trim(birthday_str) || '01') || '/' || month(trim(birthday_str) || '01'), year(trim(birthday_str) || '01'), month(trim(birthday_str) || '01'))-- 处理美国时间格式(英文),'September 04, 1952' ,'Sept 04, 1952', 'September, 1952' , 'Sept, 1952'WHEN trim(split_part(split_part(birthday_str,',',1),' ',1)) in ('January' ,'February' ,'March' , 'April' , 'May' , 'June' , 'July' , 'August' ,'September' ,'October' ,'November' ,'December', 'Jan' , 'Feb' , 'Mar' ,'Apr' , 'Aug' , 'Sept' , 'Oct' ,'Nov' , 'Dec') and regexp_like(trim(split_part(birthday_str,',',2)),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])$') > 0 -- 判断年份值是否合理then -- 'September 04, 1952' case when regexp_like(trim(split_part(split_part(birthday_str,',',1),' ',2)),'^([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])$') > 0  -- 判断日份值是否合理then concat_ws(',', year(birthday_str) || '/' || month(birthday_str) || '/' || day(birthday_str), year(birthday_str), month(birthday_str))--不完整,缺少日 'September, 1952'  。 补全日期后(日期数值随意,这里补01),利用函数 year, month,daywhen split_part(split_part(birthday_str,',',1),' ',2) is null then concat_ws(',', year(replace(birthday_str, ',' , '01,')) || '/' || month(replace(birthday_str, ',' , '01,')) , year(replace(birthday_str, ',' , '01,')), month(replace(birthday_str, ',' ,'01,')) )end--  ’September 1952‘ 格式WHEN trim(split_part(birthday_str,' ',1)) in ('January' ,'February' ,'March' , 'April' , 'May' , 'June' , 'July' , 'August' ,'September' ,'October' ,'November' ,'December', 'Jan' , 'Feb' , 'Mar' ,'Apr' , 'Aug' , 'Sept' , 'Oct' ,'Nov' , 'Dec') and regexp_like(trim(split_part(birthday_str,' ',2)),'^([1][8-9][0-9][0-9]|[2][0][0-9][0-9])$') > 0 -- 判断年份值是否合理then concat_ws(',', year(replace(birthday_str, ' ' , ' 01,')) || '/' || month(replace(birthday_str, ' ' , ' 01,')), year(replace(birthday_str, ' ' , ' 01,')), month(replace(birthday_str, ' ' , ' 01,')))ELSE concat_ws(',', ' ', ' ', ' ')END birthday_year_month INTO p_birthday_str ;RETURN (p_birthday_str) ;EXCEPTIONWHEN others THENGET STACKED DIAGNOSTICS text_var1 = RETURNED_SQLSTATE  ,text_var2 = MESSAGE_TEXT  ,text_var3 = PG_EXCEPTION_DETAIL;RAISE NOTICE E'--- [已处理的 异常代码_RETURNED_SQLSTATE ] : %', text_var1;    -- 记录异常信息RAISE NOTICE E'--- [已处理的 异常简要信息_MESSAGE_TEXT ] : %', text_var2;RAISE NOTICE E'--- [已处理的 异常详细信息_PG_EXCEPTION_DETAIL ] : %', text_var3;RETURN (concat_ws(',', ' ', ' ',' '))  ;  -- 处理异常的日期数据,直接返回。 例如日和月值不匹配,1955-02-30
END $$
;

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

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

相关文章

python测试开发面试常考题:装饰器

目录 简介 应用 第一类对象 装饰器 描述器descriptor 资料获取方法 简介 Python 装饰器是一个可调用的(函数、方法或类)&#xff0c;它获得一个函数对象 func_in 作为输入&#xff0c;并返回另一函数对象 func_out。它用于扩展函数、方法或类的行为。 装饰器模式通常用…

【学习笔记】[ZJOI2019] 开关

之前没认真学 F W T FWT FWT可惜了&#x1f605; 首先要做过这道题 [AGC034F] RNG and XOR 。 考虑 I F W T IFWT IFWT算法的本质&#x1f914; 之前我们注意到将 k k k的顺序调换并不会影响结果&#xff0c;也就是说只要做一遍 F W T FWT FWT&#xff0c;然后再除以 2 n 2^…

【数据结构】实验十一:图

实验十一 图 一、实验目的与要求 1&#xff09;掌握图的存储表示与操作实现。 2&#xff09;掌握图的连通性及其应用。 二、 实验内容 1.用邻接表存储一个图形结构&#xff0c;并计算每个顶点的度。 2. 采用深度和广度优先搜索算法&#xff0c;遍历上述这张图&#xff0c;…

vue 实现拖拽效果

实现方式&#xff1a;使用自定义指令可以实现多个面板拖拽互不影响 1.自定义指令 js directives: {// 拖拽drag(el) {el.onmousedown function (e) {let x e.pageX - el.offsetLeftlet y e.pageY - el.offsetTopdocument.onmousemove function (e) {el.style.left e.pag…

placeholder样式自定义(uniapp 微信小程序、h5)

一、使用uniapp开发 ①第一种方式&#xff1a;&#xff08;写在行内&#xff09; <input type"text" placeholder"姓名" placeholder-style"font-size:28rpx;color:#999999;" />②第二种方式&#xff1a; &#xff08;给input加上placeho…

《向量数据库指南》:向量数据库Pinecone如何集成数据湖

目录 为什么选择Databricks? 为什么选择Pinecone? 设置Spark集群 环境设置 将数据集加载到分区中 创建将文本转换为嵌入的函数 将UDF应用于数据 更新嵌入 摘要 使用Databricks和Pinecone在规模上创建和索引向量嵌入 建立在Apache Spark之上的Databricks是一个强大的…

【期末课程设计】学生成绩管理系统

因其独特&#xff0c;因其始终如一 文章目录 一、学生成绩管理系统介绍 二、学生成绩管理系统设计思路 三、源代码 1. test.c 2. Student Management System.c 3.Stu_System.c 4.Teacher.c 5.Student Management System.h 前言&#xff1a; 学生成绩管理系统含教师…

什么是Maven,Maven的概述及基本使用

MAVEN 一、Maven简介1.1、Maven概述1.2、Maven仓库1.3项目获取jar包过程 二、Maven使用2.1Maven安装配置2.1.1配置环境变量2.1.2配置本地仓库2.1.3配置阿里云私服 2.2Maven基本使用2.2.1Maven常用指令2.2.2Maven生命周期 总结 一、Maven简介 Apache Maven是一个项目管理和构建…

STM32 I2C OVR 错误

一、问题 STM32 I2C 用作从机时&#xff0c;开启如下中断并启用 callback 回调函数。 每一次复位后&#xff0c;从机都可以正常触发地址匹配中断ADDR&#xff0c;之后在该中断的回调函数中启用接收中断去收取数据时&#xff0c;却无法进入RXNE中断&#xff0c;而是触发了 OVR …

<C语言> 动态内存管理

1.动态内存函数 为什么存在动态内存分配&#xff1f; int main(){int num 10; //向栈空间申请4个字节int arr[10]; //向栈空间申请了40个字节return 0; }上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在申明的时候&#xff0c;必须指定数组的…

自然语言处理NLP介绍——NLP简介

目录 内容先进性说明内容大纲概要云服务器的使用 内容先进性说明 内容大纲概要 云服务器的使用

githack的安装步骤+一次错误体验

一.githack的安装步骤 1.要在Kali Linux上安装GitHack工具&#xff0c;您可以按照以下步骤操作&#xff1a; 打开终端并使用以下命令克隆GitHack存储库&#xff1a; git clone https://github.com/lijiejie/GitHack.git2.进入GitHack目录&#xff1a; cd GitHack3.安装依赖项…

一种分解多种信号模式非线性线性调频的方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

JVM-Cpu飙升排查及解决

https://blog.csdn.net/m0_37542440/article/details/123679011 1. 问题情况 在服务器上执行某个任务时&#xff0c;系统突然运行缓慢&#xff0c;top 发现cpu飙升&#xff0c;一度接近100%&#xff0c;最终导致服务假死。 2. 问题排查 1. 执行 “top” 命令&#xff1a;查看所…

Elasticsearch

文章目录 分布式搜索引擎elasticsearch介绍elasticsearch作用ELK技术栈elasticsearch和lucene 倒排索引正向索引倒排索引正向和倒排比较 es的一些概念文档和字段索引和映射mysql与elasticsearch elasticsearch安装部署单点es部署kibana安装IK分词器扩展词词典停用词典 索引库操…

Go语言基础语法八万字详解,对小白友好

基本语法——变量var 变量的使用 什么是变量 变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。 所以变量的本质就是一小块内存&#xff0c;用于存储数据&#xff0c;在程序运行过程中数值可以改变 声明变量 var名称类型是声明单个变量的语法…

PaddleOCR #PP-OCR常见异常扫雷

异常一&#xff1a;ModuleNotFoundError: No module named ‘tools.infer’ 实验案例&#xff1a; PaddleOCR #使用PaddleOCR进行光学字符识别&#xff08;PP-OCR文本检测识别&#xff09; 参考代码&#xff1a; 图片文本检测实验时&#xff0c;运行代码出现异常&#xff1a;M…

自然语言处理从入门到应用——LangChain:模型(Models)-[大型语言模型(LLMs):缓存LLM的调用结果]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 from langchain.llms import OpenAI在内存中缓存 import langchain from langchain.cache import InMemoryCachelangchain.llm_cache InMemoryCache()# To make the caching really obvious, lets use a slower mode…

【我们一起60天准备考研算法面试(大全)-第二十七天 27/60】【真分数】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

springboot修改ReqeustMappingHandlerMapping

RequestMappingHandlerMapping RequestMappingHandlerMapping将http请求映射到处理的方法上,负责解析处理器方法上的注解…如&#xff1a;RequestMapping ,GetMapping&#xff0c;&#xff0c;PostMapping,将请求路径&#xff0c;请求方法&#xff0c;请求参数等信息和 处理器…