微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 plsql 中插入格式为 mm/dd/yyyy 的日期和时间和格式为 hh24:mm:ss 的时间

如何解决在 plsql 中插入格式为 mm/dd/yyyy 的日期和时间和格式为 hh24:mm:ss 的时间

假设我有一个包含 Name、DOJ、TOJ 列的 Student 表。 为了以 mm/dd/yyyy 格式输入日期和 hh24:mm:ss 格式的时间戳,我使用了 ALTER SESSION SET NLS_DATE_FORMAT='MM/DD/YYYY' 和 ALTER NLS_TIMESTAMP_FORMAT='HH24:MI:SS' 但我想知道在不涉及会话的情况下以这种格式输入的替代解决方案。请指导我完成此操作。

CLICK HERE TO VIEW COLUMNS AND THEIR DATA TYPES

解决方法

我们将日期/时间存储在 DATE 列(这是 Oracle 对日期时间的不恰当名称)或 TIMESTAMP 列(它具有更高的精度并且也可以处理时区)中。这些类型没有格式。这很重要,因为在数据库中比较和排序它们工作正常,因为 DBMS 知道如何处理日期时间,而用户则以他们的格式查看日期。例如,我将我的 Windows 设置为德语,所以我会以某种德语格式看到日期时间,而您会以习惯的格式看到相同的日期。

很少有您希望单独存储日期和时间的情况。原因通常是您可以将它们设置为 null。没有时间的日期意味着“一整天”。没有日期的时间意味着“这次的每一天”。但是,无论如何,您通常希望更高级(“每个星期二和星期三”、“每个 12 月 24 日”等),为此您需要更复杂的东西,然后将日期和时间一分为二。

所以,通常我们只存储日期和时间的组合。为了精确到秒,我们使用 DATE。如果我们分别想要它们,我们就必须考虑合适的数据类型,因为 Oracle 没有真正的日期类型,也没有时间类型。所以我们要么使用 DATE 并忽略日期部分或时间部分,要么我们使用字符串。通常首选前一种解决方案,因为您不能错误地输入无效数据,例如 2 月 30 日或 23:66:00。

如果您想存储格式化日期和时间,您就是在谈论字符串。我不推荐这个。字符串不是适合日期和时间的数据类型。并且格式“01/02/2000”是不明确的。有些人会将其读为 2 月 1 日,有些人会读为 1 月 2 日。

如果您想这样做,您必须将列类型更改为 VARCHAR2 并只存储诸如“02/25/2021”和“13:28:56”之类的值。

但是,如果您想对数据进行排序或比较日期/时间,或者只是以他们习惯的格式将它们显示给外国用户,则始终必须转换它们。例如:

select *
from mytable
order by to_date(doj || ' ' || toj,'mm/dd/yyyy hh24:mi:ss');
,

恐怕要更改默认格式,您别无选择,只能在数据库级别或会话级别更改 NLS_DATE_FORMAT。

但是如果您的目的是在前端以特定格式显示日期,那么您可以使用如下所示的 to_char() 函数:

SELECT NAME,to_CHAR(DOJ,'dd/mm/yyyy'),to_CHAR(TOJ,'HH24:MI:SS') FROM table

在系统级别更改默认日期格式:

ALTER SYSTEM SET NLS_DATE_FORMAT='DD/MM/YYYY' scope=both;

您还可以在启动时使用登录触发器更改默认日期格式以更改 nls_date_format

CREATE OR REPLACE TRIGGER CHANGE_DATE_FORMAT
AFTER LOGON ON DATABASE
call DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT','YYYYMMDD');

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。