我目前正在将一些数据从Oracle迁移到Postgres.我在行数之间做了一些基本的比较,我在其中一个查询中发现了一个问题.首先,所有数据都已成功从Oracle迁移到Postgres,其中所有表的行数都匹配.在那之后,我生成了一些在一些SELECT语句上生成的json文件,这就是我发现使用Oracle生成的json文件与使用postgres生成的json文件之间的差异的地方.

下面是一个postgres查询,它生成一个json文件

SELECT * FROM some_table WHERE recurring_end_dt >= CURRENT_DATE

下面是来自Oracle的查询

SELECT * FROM some_table WHERE recurring_end_dt >= sysdate

如您所知,两个数据库在该表中的行数是相同的.这两个数据库列中的NULL计数也是相同的.

Postgres的行数为14700,而Oracle的行数为14400.因为postgres中有300个额外的行,所以我试图了解重复出现的end_date对于这300行的值是什么.我发现它们与Oracle中的值完全匹配.例如,Postgres中的值是2023-12-07,而Oracle中同一主键的值是07-DEC-23.然而,Oracle中的行不会显示为查询结果的一部分,即使它们应该显示.那么Oracle或Postgres是否存在问题,因为从技术上讲,Postgres返回了正确的查询

推荐答案

在Oracle中,DATE是一种二进制数据类型,由代表世纪、世纪年、月、日、小时、分钟和秒的7个字节组成.它ALWAYS包含这些组件,并且它NEVER以任何特定的人类可读格式存储.

例如,Postgres中的值是2023-12-07,而Oracle中相同主键的值是07-DEC-23.

不,不是的.您使用的客户端应用程序在Oracle中的值是displayed,但该值不是07-DEC-23,它将是一个包含日期和时间组件的二进制值,并且未显示时间组件.

您的客户端应用程序可能正在使用default NLS_DATE_FORMAT session parameter to format how it displays dates;您可以使用以下命令更改NLS_DATE_FORMAT:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

然后,您将看到SYSDATE将有一个时间部分,您表中的日期也是如此(如果您没有显式设置它们,则它们将默认为午夜).


那么Oracle或Postgres是否存在问题,因为从技术上讲,Postgres返回了正确的查询

这不是一个问题,你的问题是问不同的事情.

  • 在PostgreSQL中,您只比较日期.
  • 在Oracle中,您比较日期和时间,因此不会获得从今天午夜到当前时刻之前的值;这意味着如果表中的数据具有午夜的所有时间分量,则将排除今天的所有行.

如果您需要今天午夜的值(而不是当前时刻的值),则使用:

SELECT * FROM some_table WHERE recurring_end_dt >= TRUNC(sysdate)

Database相关问答推荐

网络分区恢复后副本的更新数据发生了什么

Sequel Pro / MAMP 在哪里存储本地数据库?

在哪里存储 PHP 应用程序的数据库登录凭据

Sql更新查询

授予对具有特定前缀的多个表的权限

基于邮政编码的纬度和经度

Entity Framework:如何检测对数据库的外部更改

数据验证是否应该在数据库级别进行?

SQL 历史(history)表设计

使用 2 个进程处理数据库

将 Android Room 数据库与 Firebase 实时数据库相关联

HTML5 数据库存储 (SQL lite) - 几个问题

自动增量唯一标识符

从 Java 创建 MySQL 数据库

不带 WHERE 子句的 UPDATE 查询

Oracle:如何在 Oracle SQL 中将十六进制转换为十进制?

复式记账的关系数据模型

Phonegap 离线数据库

数据库 - (行或记录、列或字段)?

有任何使用协议缓冲区的经验吗?