why

最近在开发数据中台项目,其他平台的部分业务要迁移到中台实现,其他平台使用的数据库是 MySQL、Oracle 而中台使用的是 Greenplum 数据库,各个数据库都有各自的函数和字段类型,以下 SQL 是 MySQL 数据库业务迁移至 GP 数据库的转换。

SQL

以下 SQL 使用了 4️⃣ 个参数,日期筛选字段参数:startTime、endTime(格式 2021-10-11)和时段筛选字段参数:startDuration、endDuration(格式 11:50:20)。

MySQL原始SQL

原MySQL数据库SQL(去掉一部分与时段筛选无关的代码)
主要使用的函数有 STR_TO_DATE、SUBSTRING、DATE_ADD、date_format 而这些 GP 数据都没有

-- 不跨天
SELECT*
FROMdata_bill b
WHERESTR_TO_DATE ( b.call_time, '%Y-%m-%d' ) >= STR_TO_DATE ( #{startTime} , '%Y-%m-%d' ) AND STR_TO_DATE ( b.call_time, '%Y-%m-%d' ) <= STR_TO_DATE ( #{endTime} , '%Y-%m-%d' ) AND STR_TO_DATE ( SUBSTRING ( b.call_time, 12 ), '%H:%i:%s' ) >= STR_TO_DATE ( #{startDuration}, '%H:%i:%s' ) AND STR_TO_DATE ( SUBSTRING ( b.call_time, 12 ), '%H:%i:%s' ) <= STR_TO_DATE ( #{endDuration}, '%H:%i:%s' )-- 跨天
SELECT*
FROMdata_bill b
WHERESTR_TO_DATE ( b.call_time, '%Y-%m-%d' ) >= STR_TO_DATE ( #{startTime}, '%Y-%m-%d' ) AND STR_TO_DATE ( b.call_time, '%Y-%m-%d' ) <= STR_TO_DATE ( #{endTime} , '%Y-%m-%d' ) AND ((STR_TO_DATE ( SUBSTRING ( b.call_time, 12 ), '%H:%i:%s' ) >= STR_TO_DATE ( #{startDuration}, '%H:%i:%s' ) AND STR_TO_DATE ( SUBSTRING ( b.call_time, 12 ), '%H:%i:%s' ) <= STR_TO_DATE ( '23:59:59', '%H:%i:%s' ) ) OR (STR_TO_DATE (SUBSTRING ( date_format ( DATE_ADD ( STR_TO_DATE ( b.call_time, '%Y-%m-%d %H:%i:%s' ), INTERVAL 1 DAY ), '%Y-%m-%d %H:%i:%s' ), 12 ),'%H:%i:%s' ) >= STR_TO_DATE ( '00:00:00', '%H:%i:%s' ) AND STR_TO_DATE (SUBSTRING ( date_format ( DATE_ADD ( STR_TO_DATE ( b.call_time, '%Y-%m-%d %H:%i:%s' ), INTERVAL 1 DAY ), '%Y-%m-%d %H:%i:%s' ), 12 ),'%H:%i:%s' ) <= STR_TO_DATE ( #{endDuration}, '%H:%i:%s' ) ) )

Greenplum转换后SQL

GP 数据库转换后的 SQL 主要使用了 date_trunc、to_date、SUBSTRING、CAST 函数
SUBSTRING 函数虽然名称上跟 MySQL 一致 但是用法是不同的

-- 不跨天
SELECT*
FROMdata_bill
WHEREdate_trunc( 'DAY', call_time ) >= to_date(  #{startTime}, 'yyyy-mm-dd' ) AND date_trunc( 'DAY', call_time ) <= to_date( #{endTime}, 'yyyy-mm-dd' ) AND call_time >= CAST ( SUBSTRING ( '' || call_time FROM 0 FOR 12 ) || #{startDuration} AS TIMESTAMP ) AND call_time <= CAST ( SUBSTRING ( '' || call_time FROM 0 FOR 12 ) || #{endDuration} AS TIMESTAMP ) -- 跨天
SELECT*
FROMdata_bill
WHEREdate_trunc( 'DAY', call_time ) >= to_date(  #{startTime}, 'yyyy-mm-dd' ) AND date_trunc( 'DAY', call_time ) <= to_date( #{endTime}, 'yyyy-mm-dd' ) AND ((call_time >= CAST ( SUBSTRING ( '' || call_time FROM 0 FOR 12 ) || #{startDuration} AS TIMESTAMP ) AND call_time <= CAST ( SUBSTRING ( '' || call_time FROM 0 FOR 12 ) || '23:59:59' AS TIMESTAMP ) ) OR (call_time >= CAST ( SUBSTRING ( '' || call_time FROM 0 FOR 12 ) || '00:00:00' AS TIMESTAMP ) AND call_time <= CAST ( SUBSTRING ( '' || call_time FROM 0 FOR 12 ) || #{endDuration} AS TIMESTAMP ) ) )

【SQL编程】Greenplum 数据库通过 timestamp 类型字段值实现数据的(日期时段筛选+时间时段筛选)跨天时段及不跨天时段SQL详情相关推荐

  1. 用SQL语句向数据库添加date类型字段

    在开发的时候,经常要写条SQL语句将信息插入表中,插入的数据如果字段是date类型,就必须将date类型转换成字符串String类型在通过sql语句插入数据库.这是我找到添加该字段的方法!我的解决方法 ...

  2. MySQL8.0向NOT NULL的TIMESTAMP类型字段插入NULL值的问题

    在学习SSM框架的过程中需实现如下过程: Key1:需要通过mybatis向数据库插入一条记录,且此记录包含timestamp类型字段.假设字段为[id,name,tel,pay_time],第四个为 ...

  3. MyBatis映射文件如何给数据库的int类型字段“插入”string类型记录

    MyBatis映射文件如何给数据库的int类型字段"插入"string类型记录. 数据库中对应字段名称和类型如下: 给数据库的int类型字段"插入"string ...

  4. cxf webservice接收date类型字段值为空导致异常问题解决方案

    cxf webservice接收date类型字段值为空时,后台会报错.原因是cxf没有很好处理空值的情况. 解决方案 自定义date字段的转换方式.以springboot cxf 为例.涉及以下三点改 ...

  5. Oracle中Timestamp类型字段查询结果格式化处理

    在使用Oracle数据库时,把Timestamp类型的字段查出来显示到界面上居然是一串数字,不符合我们常见的要求,我就查了一下,发现中间还有很多道道,Oracle查出来的Timestamp类型和jav ...

  6. mysql timestamp类型字段 自动更新为当前时间

    需求描述:现需要数据库中一个字段来记录当前记录的最近修改时间或者创建时间,并自动更新维护. timestamp类型的使用示例如下: 创建一个数据库,并指定 uptime为 timestamp类型 cr ...

  7. Mysql与Sql Server查询数据库中表以及表字段

    1.查询数据库表信息 mysql查询数据库中所有表信息 SELECTtable_name AS '表名',table_comment AS '说明',create_time AS '创建时间',upd ...

  8. 迁移数据时 timestamp类型字段报错: 1067 - Invalid default value for 'login_time'

    MySQL数据库升级 8.0.13,原版本5.5:执行导出来的SQL文件时报错 1067 - Invalid default value for 'login_time' 原因:MySQL 5.6以后 ...

  9. oracle timestamp怎么查询,oracle运用(一) oracle数据库使用 TIMESTAMP()类型查询数据

    1.刚开始,使用PLSQL Developer执行如下SQL语句: select billsell.CREATE_TIME from BILL_SELL billsell WHERE billsell ...

最新文章

  1. azkaban 与 java任务_Azkaban的任务类型分析35:JavaProcessJob的执行
  2. Problem 5 素数筛法+并查集
  3. python打开哪个答案_关于 Python 文件的 ‘r’ 打开模式,哪个选项的描述是正确的?_学小易找答案...
  4. 个人随笔-《江城子·驻西航》
  5. ***教程十:数据库注入(上)
  6. 当女朋友生气了而你却没发现 !!!
  7. 如何在Ubuntu 18.04上安装Django
  8. 常问 3: 谈谈MySQL共享锁与排他锁
  9. bzoj 4260 REBXOR —— Trie树
  10. 安装系统显示sql服务器未安装,mssqlserver服务未安装怎么办 mssqlserver怎么安装
  11. 数据结构与算法(七) 栈以及栈的应用
  12. ztz11的noip模拟赛T1:愤怒的XiaoX
  13. php macro,如何利用 macro 方法来扩展 Laravel 的基础类的功能
  14. angular-route 和soket注意细节点
  15. Android 虚线切割线
  16. ov5640帧率配置_ov5640摄像头设备驱动
  17. 【遥控器开发基础教程1】疯壳·开源编队无人机-GPIO(遥控器指示灯控制)
  18. CY2荧光染料,Cy2@NHS酯基本染料,Cy2DIGE NHS ester的物化性质及光谱特性
  19. QEMU 简介(一)
  20. NB-IoT低功耗技术与寻呼

热门文章

  1. 3.8 高级检索方式(二)
  2. Matlb中break 和continue 语句
  3. 爱吃苹果的与喜欢篮球的没必要非得达成一致~
  4. 【转载】FlexPaper+SWFTools 实现仿百度文库及一些小问题
  5. [转]gtest使用
  6. php查询每天的数据进行汇总,关于php:如何在一年内每天只使用一个查询来获取数据?...
  7. 简述python垃圾回收机制_python中的垃圾回收机制简述
  8. flink physical partition
  9. cpu功耗排行_2020 主流手机处理器排行榜
  10. csharp为何不流行_【经营】做餐饮,算好加减法,你不赚谁赚