gpt4 book ai didi

sql - Oracle PL/SQL : how the SYSDATE is different from 'DD-MMM-YY' ?

转载 作者:行者123 更新时间:2023-12-04 17:15:23 24 4
gpt4 key购买 nike

我想知道怎么来 SYSDATE不同于,比方说 28-APR-18 (假设 SYSDATE 是 2018 年 4 月 28 日)。

我正在调试我制作的一个小脚本,但出现了很多错误。过了一会儿,我设法缩小了表格的填充方式(它们是使用文字“DD-MMM-YYYY”方法填充的,我正在与 SYSDATE 进行比较)。

为了理解,我写了以下内容来查看每个比较:

declare var1 DATE; var2 DATE;
BEGIN
var1 := SYSDATE;
var2 := '27-APR-18';

if var1 = var2 then
DBMS_OUTPUT.PUT_LINE('oh yeah');
else DBMS_OUTPUT.PUT_LINE('WTF?');
DBMS_OUTPUT.PUT_LINE(SYSDATE);DBMS_OUTPUT.PUT_LINE('27-APR-18');
end if;
END;

如果上面运行,我得到以下(这让我感到困惑):
WTF?
27-APR-18
27-APR-18


PL/SQL procedure successfully completed.

既然它们都声明为 DATE 类型,那么它们不应该相等吗?

感谢您的时间和帮助!

最佳答案

在 Oracle 中,一个 DATE值 - 尽管名称 - 也包含时间部分。 SYSDATE包含当前日期 当前时间(最多秒)。

默认情况下,Oracle 工具(愚蠢地)隐藏了 DATE 的时间部分值(value)。如果你运行:

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as sysdate
from dual;

你可以看到。

所以 SYSDATE可能是 2018-04-27 09:15:42而字符串 (!) 常量 '27-APR-18'静默转换为 DATE午夜值: 2017-04-28 00:00:00
更多详情请看 Basic Elements of Oracle SQL章节在手册中

如果不关心时间部分,可以使用 trunc()将时间设置为午夜, trunc(sysdate) yield 2018-04-27 00:00:00 (如果今天是 2018-04-27 )。请注意 trunc()不会“删除”时间,只会将其设置为 00:00:00

无关,但是:

你永远不应该依赖于字符串和其他非字符类型之间的隐式转换 var2 := '27-APR-18'确实 - 它会例如在我的计算机上失败,因为我的默认 NLS 日期格式不同。

如果您需要 DATE值,然后指定一个适当的日期文字:
var2 := DATE '2018-04-27'; 

或者
var2 := to_date('27-APR-18', 'dd-mon-rr');

或者
var2 := to_date('27-APR-18 00:00:00', 'dd-mon-rr hh24:mi:ss');

关于sql - Oracle PL/SQL : how the SYSDATE is different from 'DD-MMM-YY' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50057190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com