蟾蜍不要 return 我的时间
Toad dont return me the time
我的日期转换有问题,当我执行这部分代码时,return我只有日期没有时间:
DECLARE
vdate VARCHAR2(255);
BEGIN
select cast(TO_TIMESTAMP_TZ('2020-09-23T03:02:00+02:00','yyyy-mm-dd"T"hh24:mi:ss"+"TZH:TZM') as date) into vdate from dual;
DBMS_OUTPUT.PUT_LINE(vdate);
END;
这个 return 只有我自己 :
23-SEP-20
如何获取日期和时间?谢谢
DECLARE
vdate VARCHAR2(255);
BEGIN
select cast(
TO_TIMESTAMP_TZ(
'2020-09-23T03:02:00+02:00',
'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM' -- remove the "+"
)
as date
)
into vdate
from dual;
DBMS_OUTPUT.PUT_LINE(vdate);
END;
/
你从字符串 (2020-09-23T03:02:00+02:00
) 到时间戳 (使用 TO_TIMESTAMP_TZ
函数,你不应该显式匹配 +
字符,而应该让TZH
格式模型匹配它)然后到一个日期,然后将它放入一个字符串变量中,该变量需要从二进制日期值到字符串的隐式转换。这一切似乎都太过分了。但是,这是最后一步,即从日期到字符串的隐式转换,这导致了您的问题,因为 Oracle 将使用 NLS_DATE_FORMAT
会话参数作为格式模型来进行转换。
解决这个问题的一种方法是使用:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS';
然后您的代码应该输出正确的值,而无需更改您的代码。
但是,您不应该使用此方法,因为它依赖于用户更改他们的会话,而大多数用户不会这样做(如果他们这样做,那么他们是就像将其更改为他们喜欢的日期格式而不是您想要的日期格式一样,这将再次打破您对代码行为的期望)。
相反,如果您需要特定格式或日期,则应使用 TO_CHAR
:
明确应用格式
BEGIN
DBMS_OUTPUT.PUT_LINE(
TO_CHAR(
TO_TIMESTAMP_TZ(
'2020-09-23T03:02:00+02:00',
'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'
),
'YYYY-MM-DD"T"HH24:MI:SS'
)
);
END;
/
(注意:您不需要:声明变量;使用 SQL;或转换为日期。相反,您可以在一行中完成所有操作。 )
如果您确实想使用一个变量,那么您可以在 PL/SQL 中完成所有操作,方法是将值直接赋给变量(不需要 context-switch 使用 SQL引擎):
DECLARE
vdate DATE;
BEGIN
vdate := TO_TIMESTAMP_TZ(
'2020-09-23T03:02:00+02:00',
'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'
);
DBMS_OUTPUT.PUT_LINE( TO_CHAR( vdate, 'YYYY-MM-DD"T"HH24:MI:SS' ) );
END;
/
db<>fiddle here
在 Toad 中,您可以在 查看 -> Toad 选项 下设置日期格式掩码。我的截图来自 Toad 13.2.0.258.
我的日期转换有问题,当我执行这部分代码时,return我只有日期没有时间:
DECLARE
vdate VARCHAR2(255);
BEGIN
select cast(TO_TIMESTAMP_TZ('2020-09-23T03:02:00+02:00','yyyy-mm-dd"T"hh24:mi:ss"+"TZH:TZM') as date) into vdate from dual;
DBMS_OUTPUT.PUT_LINE(vdate);
END;
这个 return 只有我自己 :
23-SEP-20
如何获取日期和时间?谢谢
DECLARE
vdate VARCHAR2(255);
BEGIN
select cast(
TO_TIMESTAMP_TZ(
'2020-09-23T03:02:00+02:00',
'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM' -- remove the "+"
)
as date
)
into vdate
from dual;
DBMS_OUTPUT.PUT_LINE(vdate);
END;
/
你从字符串 (2020-09-23T03:02:00+02:00
) 到时间戳 (使用 TO_TIMESTAMP_TZ
函数,你不应该显式匹配 +
字符,而应该让TZH
格式模型匹配它)然后到一个日期,然后将它放入一个字符串变量中,该变量需要从二进制日期值到字符串的隐式转换。这一切似乎都太过分了。但是,这是最后一步,即从日期到字符串的隐式转换,这导致了您的问题,因为 Oracle 将使用 NLS_DATE_FORMAT
会话参数作为格式模型来进行转换。
解决这个问题的一种方法是使用:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS';
然后您的代码应该输出正确的值,而无需更改您的代码。
但是,您不应该使用此方法,因为它依赖于用户更改他们的会话,而大多数用户不会这样做(如果他们这样做,那么他们是就像将其更改为他们喜欢的日期格式而不是您想要的日期格式一样,这将再次打破您对代码行为的期望)。
相反,如果您需要特定格式或日期,则应使用 TO_CHAR
:
BEGIN
DBMS_OUTPUT.PUT_LINE(
TO_CHAR(
TO_TIMESTAMP_TZ(
'2020-09-23T03:02:00+02:00',
'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'
),
'YYYY-MM-DD"T"HH24:MI:SS'
)
);
END;
/
(注意:您不需要:声明变量;使用 SQL;或转换为日期。相反,您可以在一行中完成所有操作。 )
如果您确实想使用一个变量,那么您可以在 PL/SQL 中完成所有操作,方法是将值直接赋给变量(不需要 context-switch 使用 SQL引擎):
DECLARE
vdate DATE;
BEGIN
vdate := TO_TIMESTAMP_TZ(
'2020-09-23T03:02:00+02:00',
'yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'
);
DBMS_OUTPUT.PUT_LINE( TO_CHAR( vdate, 'YYYY-MM-DD"T"HH24:MI:SS' ) );
END;
/
db<>fiddle here
在 Toad 中,您可以在 查看 -> Toad 选项 下设置日期格式掩码。我的截图来自 Toad 13.2.0.258.