oracle - 如何理解给定的 sysdate 是日期或时间戳

标签 oracle plsql

我有一个过程。它采用 Date 类型的日期参数。我想知道的是其他用户将 sysdate 发送到我的过程。他们将 sysdate 发送到我的过程的格式是什么?

例如: 01/02/2021 或 01/02/2020 00:00:00(时间戳)

我的程序是否接受所有发送格式?也许 Date 类型将发送格式转换为这种样式 01/02/2020。我不确定。

我的意思是我的日期参数是否接受所有日期格式,因为我想在我的程序中使用没有秒或分钟的日期。

我的程序是

DECLARE
var_P_DATE                DATE;    (for example : 01/01/2021)
BEGIN
 SELECT last_day(var_P_DATE) INTO v_last_day FROM DUAL; (31/01/2021)
 if v_last_day = var_P_DATE (it returns false because no second or minutes)
  .....
END;

我使用了 DBMS.OUTPUT。我认为日期类型转换就像这样 01/02/2021,我没有收到任何错误,但我不确定。

最佳答案

您的过程只会收到一个date,因为那是形式参数的数据类型。当过程被调用时,调用者可以提供一个 date,或者可以隐式转换为 date 的东西(尽管它们不应该;隐式转换通常是一件坏事,特别是来自字符串)。

date 数据类型包括时间部分。如果传递给您的日期不是午夜时间,但您希望忽略该日期,例如 sysdate,您可以使用 the trunc() function ,它是默认的 'DD' 格式;而且你不需要select from dual:

v_last_day := last_day(trunc(var_P_DATE));

如果调用者传入 systimestamp,那么当您看到它时,它仍然会隐式转换为 date - 这意味着它会丢失任何小数秒和时区信息,但保留小时、分钟和秒。

日期和时间戳没有任何固有的人类可读格式。可以使用各种格式显示日期 - see the documentation - 显式使用 to_char() 和格式模型,或者隐式使用您的 session 设置。

当你做的时候

dbms_output.put_line(var_P_DATE);

您正在使用 session 的 NLS_DATE_FORMAT 设置将 date 值隐式转换为字符串。因此,不同的用户可能会以不同的格式看到它。你无法控制它。如果您想查看特定格式,请指定该格式,例如:

dbms_output.put_line(to_char(var_P_DATE, 'YYYY-MM-DD'));

您也无法控制调用者是否看到该输出 - 这取决于应用程序/客户端及其设置。看起来您可能只是用它来调试比较问题,所以这在这里可能无关紧要。

作为演示:

declare
  var_P_DATE date := sysdate;
  v_last_day date;
begin
  v_last_day := last_day(var_P_DATE);
  dbms_output.put_line(to_char(v_last_day, 'YYYY-MM-DD HH24:MI:SS'));
  v_last_day := last_day(trunc(var_P_DATE));
  dbms_output.put_line(to_char(v_last_day, 'YYYY-MM-DD HH24:MI:SS'));
end;
/

2021-02-28 09:59:02
2021-02-28 00:00:00

db<>fiddle demo

关于oracle - 如何理解给定的 sysdate 是日期或时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66257219/

相关文章:

oracle - 有人使用 PL/SQL Web Toolkit 吗?

java - 如何将空字符串更新到oracle Clob

c# - 如何通过 ADO.net 使用 Linq 访问 oracle 数据?

sql - 甲骨文基本问题

oracle - ORA-03001 : unimplemented feature when converting XMLTYPE to NCLOB from table

database - 如何检查类型的依赖项以删除它们并替换/修改初始类型?

oracle - 是否可以使用 OData 从 Oracle 公开数据?

oracle - 如何终止仅处于非事件状态的 Oracle 数据库 session ?

oracle - 我可以删除/添加属性而不产生任何后果吗? Oracle 对象类型

oracle - 我可以复制 :OLD and :NEW pseudo-records in/to an Oracle stored procedure?