摘要:本文章主要介绍了GaussDB(DWS)数据类型中的DATE类型在不同数据库模式下且在不同应用场景下的行为表现及对比。

本文分享自华为云社区《GaussDB(DWS)数据类型之DATE类型》,原文作者:小仲。

GaussDB(DWS)中有三种模式,分别是Oracle模式,TD模式和MySQL模式。不同的类型在不同的模式下,也有不同的行为表现。接下来便对GaussDB(DWS)中的日期DATE类型进行详细介绍。

DATE类型的取值范围:

GaussDB(DWS)在存储DATE类型时,不支持年月日全部为零或部分为零的场景,且取值范围在三种模式下是不同的:

在Oracle模式下,DATE类型的取值范围是公元前4713年1月1日到公元294277年1月1日。在MySQL模式和TD模式中,DATE类型的取值范围是公元前4713年到公元5874897年。

用例说明:

1. 不同模式下DATE类型的行为

Oracle模式

a. DATE类型的表现

GaussDB(DWS)中DATE类型存储时不带时分秒,由于在Oracle模式下的DATE类型需要带有时分秒,使得GaussDB(DWS)在Oracle模式下存在带时分秒的和不带时分秒的两种DATE类型,所以为了容易区分,在显示时不带时分秒的DATE类型用列名date表示;带时分秒的DATE类型用同样带时分秒的TIMESTAMP类型的列名timestamp表示。

postgres=# select date '4713-01-01 BC';

       timestamp       

------------------------

 4713-01-01 00:00:00 BC

(1 row)

postgres=# select date '294277-01-01';

       timestamp      

-----------------------

 294277-01-01 00:00:00

(1 row)

b. Oracle模式下得到只含有年月日的DATE类型的方法

如果想要在Oracle模式下将日期转成只有年月日的DATE类型,有方法可以实现么?事实上也是有的。GaussDB(DWS)提供了两种方式,一种是通过在Oracle模式下使用date函数:date函数的参数至少需要包含年月日,并将日期中的年月日提取并输出;另一种则是通过cast函数进行转换,但转换时应将date加上双引号,否则转换后的数据还是会含有时分秒部分。

postgres=# select date('2008-05-24 10:40:21');

    date   

------------

 2008-05-24

(1 row)

postgres=# select cast('2008-05-24 10:40:21.100050' as "date");

    date   

------------

 2008-05-24

(1 row)

postgres=# select cast('2008-05-24 10:40:21.100050' as date);

      timestamp     

---------------------

 2008-05-24 10:40:21

(1 row)

c. DATE类型操作符

MySQL模式和TD模式: DATE类型只有年月日。

a. DATE类型的表现

MySQL模式与TD模式下DATE类型无差异。

mysql_db=# select date '5874897-01-01';

     date    

---------------

 5874897-01-01

(1 row)

td_db=# select date '5874897-01-01';

     date    

---------------

 5874897-01-01

(1 row)

b. MySQL模式与TD模式下得到只含有年月日的DATE类型的方法

由于在MySQL模式或TD模式下,DATE类型只有年月日,故使用to_date函数和date函数所得到的结果都只有年月日,同时cast函数进行类型转换时,date加不加引号所得到的结果也是一致的。

td_db=# select date('2008-05-24 10:40:21');

    date   

------------

 2008-05-24

(1 row)

td_db=# select cast('2008-05-24 10:40:21.100050' as "date");

    date   

------------

 2008-05-24

(1 row)

td_db=# select cast('2008-05-24 10:40:21.100050' as date);

    date   

------------

 2008-05-24

(1 row)

mysql_db=# select date('2008-05-24 10:40:21');

    date   

------------

 2008-05-24

(1 row)

mysql_db=# select cast('2008-05-24 10:40:21.100050' as "date");

    date   

------------

 2008-05-24

(1 row)

mysql_db=# select cast('2008-05-24 10:40:21.100050' as date);

    date   

------------

 2008-05-24

(1 row)

c. DATE类型操作符

与Oracle模式的差异:当DATE类型的值进行相减时返回值不带day,只有数值。

2. 不同模式下的DATE类型相关函数结果的行为:

GaussDB(DWS)中存在与DATE类型相关的函数:

  • to_date:将文本类型的值转换为指定格式的时间戳,若参数只有一个时,默认格式为DATE类型的格式。
  • to_char:将一个DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE或者TIMESTAMP WITH LOCAL TIME ZONE类型的DATETIME或者INTERVAL值按照fmt指定的格式转换为VARCHAR类型。可选参数fmt可以为以下几类:日期、时间、星期、季度和世纪。每类都可以有不同的模板,模板之间可以合理组合;常见的模板有:HH、MM、SS、YYYY、MM、DD。模板可以有修饰词;常用的修饰词是FM,可以用来抑制前导的零或尾随的空白。返回值类型:varchar
  • current_date:获取当前日期。
  • date_part:获取给定日期时间中的指定域值。
  • isfinite:测试给定日期是否为有效日期。

Oracle模式:由于Oracle模式中的DATE类型含有时分秒,故to_date和to_char函数得到的结果含有时分秒。

TD模式:由于TD模式下的DATE类型只有年月日,故to_date函数得到的结果只有年月日。在TD模式下,to_char函数的输出结果可以由GUC参数convert_empty_str_to_null_td控制,若不设置参数则返回上表中的结果,若设置参数则返回结果与TD数据库中的结果保持一致,为2008/05/24。

MySQL模式:由于MySQL模式下DATE类型只有年月日,故to_date函数和to_char函数的返回结果只有年月日。

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~

点击关注,第一时间了解华为云新鲜技术~

不同数据库模式下DATE类型的行为解析的更多相关文章

  1. “Options模式”下各种类型的Options对象是如何绑定的?

    “Options模式”下各种类型的Options对象是如何绑定的? 旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基 ...

  2. .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?

    旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基元类型,也可以是一个自定义数据类型,还可以是一个数组.集合或者字典类 ...

  3. 向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE('{0}','YYYY-MM-DD'))

    需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字 ...

  4. Oracle数据库date类型与Java中Date的联系与转化

    以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助.new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当前 ...

  5. 向mysql中插入Date类型的数据

    先看数据库表的定义 date字段为sql.date类型.我要向其中插入指定的日期和当前日期. 一.插入当前日期 思路:先获取当前系统,在将当前系统时间转换成sql类型的时间,然后插入数据库.代码如下 ...

  6. 处理date类型对象的方式

    在jsp中通过key属性映射到编译后jsp页面的name属性,通过model中的 setxxxx()方法将jsp页面通过wdatepicker插件产生的string类型的数据转换为timestamp类 ...

  7. oracle的Date类型遇到MyBatis产生的坑

    坑描述: 公司的订单表数据量巨大(亿级),在进行查询的时候,发现一个慢查询. 背景: 数据库:oracle 表:T_order 索引字段:create_date  (字段类型 date) 慢查询sql ...

  8. SpringMVC返回Json,自定义Json中Date类型格式

    http://www.cnblogs.com/jsczljh/p/3654636.html —————————————————————————————————————————————————————— ...

  9. SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题

    数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...

  10. 测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程

    测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程 最近系统出现问题,由于数据库产生的日志量太大无法开启归档模式,导致offline的 ...

随机推荐

  1. Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法

    Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,此处测试代码如下,这里使用add方法: 1 public class main { 2 public static vo ...

  2. H5-geolocation学习

    geolocation--定位 PC--IP地址 精度比较低 IP库 Chrome -> Google 手机--GPS window.navigator.geolocation 单次 getCu ...

  3. C++基础杂记(1)

    结构体中的位字段 共用体 烦人的枚举 枚举的声明与赋值 枚举的取值范围与强制类型转换 枚举的注意事项 指针 为什么是 int* ptr 而不是 int *ptr ? 避免危险的指针 使用array和v ...

  4. JAVA架构师

    https://github.com/zq99299/note-architect https://zq99299.github.io/note-architect/hc/ https://zq992 ...

  5. 3款免费又好用的 Docker 可视化管理工具

    前言 Docker提供了命令行工具(Docker CLI)来管理Docker容器.镜像.网络和数据卷等Docker组件.我们也可以使用可视化管理工具来更方便地查看和管理Docker容器.镜像.网络和数 ...

  6. require()、import、import()有哪些区别?

    require().import.import()是我们常用的引入模块的三种方式,代码中几乎处处用到.如果对它们存在模糊,就会在工作过程中不断产生困惑,更无法做到对它们的使用挥洒自如.今天我们来一起捋 ...

  7. Vite 5.0有哪些新变化?

    Rollup 4 Vite 现在使用 Rollup 4,它也带来了一些重大的变化,特别是: 导入断言(assertions 属性)已被重命名为导入属性(attributes 属性). 不再支持 Aco ...

  8. SQLBI_精通DAX课程笔记_02_数据类型

    SQLBI_精通DAX课程笔记_02_数据类型 PowerBi 和 Analysis Services 在数据加载环节,无论数据源是什么类型,都会自动将数据转化为DAX可用的数据类型集. 以下链接为微 ...

  9. IDEA编译器的永久试用设置与基本使用

    参考视频: 最通俗易懂的JDK.IDEA的安装使用权威指南 2023新版前端Web开发HTML5+CSS3+移动web视频教程,前端web入门首选黑马程序员 一.安装包下载与安装 官网下载地址 个人使 ...

  10. 【布局技巧】Flex 布局下居中溢出滚动截断问题

    在页面布局中,我们经常会遇到/使用这么一类常见的布局,也就是列表内容水平居中于容器中,像是这样: <ul class="g-contaner"> <li>& ...