[英]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
虽然,我认为你在做什么没有多大意义:
那么,你为什么不直接使用
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
相同的年到秒组件,但也有小数秒组件和可选的时区组件。
DATE
和TIMESTAMP
都没有格式,因为它们只是二进制数据,并且您无法删除时间组件,因为它们都始终具有时间组件。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.