如何在 oracle 中的 to_timestamp() 中传递字符串变量
Posted
技术标签:
【中文标题】如何在 oracle 中的 to_timestamp() 中传递字符串变量【英文标题】:How to pass string variable inside to_timestamp() in oracle 【发布时间】:2015-02-20 03:29:32 【问题描述】:我有一个这样的查询:
select from_tz(to_timestamp(v_time,'YY-MM-DD HH24:MI:SS'), 'UTC')
at time zone 'America/New_York' from dual;
如果我使用字符串 Date 而不是 v_time 那么它工作正常。但是我需要在to_timestamp里面传递一个变量v_time,我该怎么做呢?
提前致谢。
完整代码在这里:
DECLARE
v_test varchar2(200);
v_cur_time varchar2(200);
v_local_strem_time varchar2(200);
v_time varchar2(200);
v_time_diff NUMBER(20);
v_temp varchar2(200);
BEGIN
SELECT TO_CHAR(SYSDATE, 'DD-MON-YY HH24:MI:SS') into v_cur_time
FROM DUAL;
select substr(((select TO_CHAR(date_time,'YY-MM-DD HH24:MI:SS') from observation_measurement where observation_measurement_id=5777992)), 1,17)
into v_time from dual;
v_temp := v_time;
select from_tz(to_timestamp(v_temp,'YY-MM-DD HH24:MI:SS'), 'UTC')
at time zone 'America/New_York' into v_local_strem_time from dual;
select 24 * (to_date(v_cur_time, 'YY-MM-DD HH24:MI:SS')
- to_date(v_local_strem_time, 'YY-MM-DD HH24:MI:SS')) into v_time_diff
from dual;
DBMS_OUTPUT.PUT_LINE(v_time_diff);
END;
【问题讨论】:
v_time
、VARCHAR
或 DATE
的数据类型是什么?
【参考方案1】:
变量必须是declared
(在code block
或procedure
或function
等中)
declare
v_time varchar(20);
outval timestamp;
begin
v_time := '15-02-20 07:13:10';
select from_tz(to_timestamp(v_time,'YY-MM-DD HH24:MI:SS'), 'UTC')
at time zone 'America/New_York' into outval from dual;
dbms_output.put_line(outval);
end;
输出: 20-FEB-15 02.13.10.000000 AM
编辑问题后编辑:
问题在于包含 AMERICA/NEW_YORK
字符串的 v_local_strem_time
,一种方法是使用 SUBSTR
函数删除不必要的字符串。让我测试一下:
Create table observation_measurement(
observation_measurement_id number,
date_time date
)
insert into observation_measurement
values (5777992,to_date('214/10/09', 'YY-MM-DD HH24:MI:SS'));
DECLARE
v_test varchar2(200);
v_cur_time varchar2(200);
v_local_strem_time varchar2(200);
v_time varchar2(200);
v_time_diff NUMBER(20);
v_temp varchar2(200);
BEGIN
SELECT TO_CHAR(SYSDATE, 'DD-MON-YY HH24:MI:SS') into v_cur_time
FROM DUAL;
select substr(((select TO_CHAR(date_time,'YY-MM-DD HH24:MI:SS') from observation_measurement where observation_measurement_id=5777992)), 1,17)
into v_time from dual;
v_temp := v_time;
select from_tz(to_timestamp(v_temp,'YY-MM-DD HH24:MI:SS'), 'UTC')
at time zone 'America/New_York' into v_local_strem_time from dual;
select 24 * (to_date(v_cur_time, 'YY-MM-DD HH24:MI:SS')
- to_date(substr(v_local_strem_time,0,18), 'YY-MM-DD HH24:MI:SS')) into v_time_diff
from dual;
DBMS_OUTPUT.PUT_LINE(v_time_diff);
END;
输出: 143241
也可能你的结构observation_measurement.date_time
的数据类型不是日期,那个时候你可能需要做适当的转换。
【讨论】:
@Fereg:我用完整的代码编辑了这个问题。虽然我在代码块中声明了变量,但它仍然显示错误,例如:“日期格式图片在转换整个输入字符串之前结束”。我从另一个查询中得到了 v_time 变量。请查看已编辑的问题。 @Novis 回答已编辑,您可以查看,抱歉耽误了我的忙。以上是关于如何在 oracle 中的 to_timestamp() 中传递字符串变量的主要内容,如果未能解决你的问题,请参考以下文章