繁体   English   中英

从时间戳中获取 oracle 中的日期而不使用尾随 o?

[英]Getting date in oracle from timestamp without trailing o's?

我一直在搜索堆栈和谷歌以找到一种从时间戳中提取日期的方法,而尾随零仍然是日期而不是 VARCHAR 变量-

例如:

SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL

给: 18-JUL-12 00:00:00

最后我希望它采用“ '18/07/2012'日期格式。

如果可能,请提前 TIA。

嗯,这就是你说的。 在我的数据库中,它导致

SQL> SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;

TRUNC(TO
--------
18.07.12

SQL>

如果您想获得不同的结果,请更改 session:

SQL> alter session set nls_Date_format = 'dd/mm/yyyy';

Session altered.

SQL> SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;

TRUNC(TO_D
----------
18/07/2012

或者使用所需的格式掩码应用TO_CHAR

SQL> SELECT to_char(TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')), 'dd/mm/yyyy') FROM DUAL;

TO_CHAR(TR
----------
18/07/2012

虽然,我认为你在做什么没有多大意义:

  • 首先将字符串 ('2012-07-18 13:27:18') 转换为日期
  • 然后你截断时间的一部分
  • 最后,您只想获取日期部分,但再次作为字符串

那么,你为什么不直接使用

SQL> select '18/07/2012' from dual;

'18/07/201
----------
18/07/2012

(当然,除非该日期字符串实际上来自错误的表的某个位置;永远不要将日期存储到VARCHAR2列中)。

数据类型 DATE 和 TIMESTAMP 是 oracle 内部二进制类型。 根据定义,它们包含一个时间组件 - DATE 解析为秒,TIMESTAMP 解析为纳秒。 相反,由于这些是内部的二进制结构,因此您在屏幕上看到的内容再次按定义转换为字符串 - VARCHAR2。 您可能没有指定 TO_CHAR,但是选择要显示的 DATE 或 TIMESTAMP(未在内部使用)的行为迫使oracle 对其应用 TO_CHAR。

由于根据定义,这些数据类型固有地包含时间组件,因此在逻辑上说您要“从时间戳中提取日期而尾随零(时间组件)仍然是日期而不是 VARCHAR 变量 - ”。

我一直在搜索堆栈和谷歌以找到一种从时间戳中提取日期的方法,而尾随零仍然是日期而不是VARCHAR变量

如果您希望该值仍然是DATE ,则不能

DATE在内部存储为7 个字节,并且始终具有年(2 个字节)、月、日、小时、分钟和秒(每个 1 个字节)分量。

TIMESTAMP在内部存储 11-20 个字节,具有与DATE相同的年到秒组件,但也有小数秒组件和可选的时区组件。

DATETIMESTAMP都没有格式,因为它们只是二进制数据,并且您无法删除时间组件,因为它们都始终具有时间组件。

 SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL

给: 18-JUL-12 00:00:00

该查询输出一个DATE并且根据您使用的用户界面,日期可能会被隐式转换为字符串以进行输出。 SQL/Plus 和 SQL 开发人员使用NLS_DATE_FORMAT session 参数在向用户显示DATE时将其隐式转换为字符串:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;

输出: 2012-07-18 13:27:18

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;

输出: 2012-07-18

但是,任何用户都可以随时更改自己的session参数,因此您永远不应依赖日期的隐式格式。

如果你想要一个DATE ,那么你不应该期望它以任何特定的方式格式化,因为它只是二进制数据。 如果您想要一个格式化的日期,那么您应该使用TO_CHAR将其显式转换为具有所需格式的字符串:

SELECT TO_CHAR(
         TRUNC( to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS') ),
         'DD/MM/YYYY'
       )
FROM   DUAL;

输出: 18/07/2012

db<>小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM