【问题标题】:Datetime to Varchar2 conversion日期时间到 Varchar2 的转换
【发布时间】:2016-03-09 11:07:44
【问题描述】:

我的一张表中的日期值为 2016-02-15T18:30:00.000Z,我需要显示与 15/2/2016 6:30:00 PM 相同的值。

我正在尝试使用 TO_CHAR,如下所示:

a:=2016-02-15T18:30:00.000Z
b:= TO_CHAR(a, 'MM/D/YYYY HH12:MI:SS AM');

但它根本不起作用。

【问题讨论】:

标签: datetime plsql


【解决方案1】:

您对 a 的赋值在 PL/SQL 中无效。试试这个:

declare
   a date;
   b varchar2(20);
begin
   a:= timestamp '2016-02-15 18:30:00.000';
   b:= TO_CHAR(a, 'MM/D/YYYY HH12:MI:SS AM');
   dbms_output.put_Line(b);
end;

我对您下面评论中的代码进行了改进:

CREATE OR REPLACE FUNCTION get_project_launch_date
   ( p_form_id_param IN NUMBER )
   RETURN VARCHAR2
AS
   project_launch_date VARCHAR2(100);
   temp TIMESTAMP;
   temp1 VARCHAR2(100);
BEGIN
   --fetching the doc created by information ;
   SELECT ANSWER INTO project_launch_date
     FROM table 
    WHERE QUESTION_ID = id 
      AND FORM_ID = p_form_id_param;
   temp := to_timestamp(project_launch_date,
                       'YYYY-MM-DD"T"HH24:MI:SS.FF"Z"');
   temp1 := TO_CHAR(temp,'DD/MM/YYYY HH12:MI:SS AM');
   DBMS_OUTPUT.PUT_LINE('OUTPUT =' || temp1);
   RETURN temp;
END;

【讨论】:

  • 我正在使用的函数:创建或替换函数 get_project_launch_date (p_form_id_param IN NUMBER) RETURN VARCHAR2 AS project_launch_date VARCHAR2(100);临时 VARCHAR2(100); temp1 VARCHAR2(100); BEGIN——获取信息创建的文档;从表中选择答案进入 project_launch_date,其中 QUESTION_ID = id 和 FORM_ID = p_form_id_param;临时 := 时间戳 '(project_launch_date)'; temp1 := TO_DATE(temp,'DD/MM/YYYY HH12:MI:SS AM'); DBMS_OUTPUT.PUT_LINE('OUTPUT =' || temp1);返回温度;结尾; /
  • [错误] PLS-00166 (17: 17): PLS-00166: 日期、时间、时间戳或间隔文字格式错误
  • 我的第一个查询的输出格式为:2016-02-15T18:30:00.000Z
  • @TonyAndrews,您在尝试将字符串转换为时间戳时不需要翻译。你可以这样做:to_timestamp(str, 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"')
  • 啊是的 - 现在你说我以前犯过那个错误!
【解决方案2】:

根据您的要求,此日期格式无法识别 甲骨文。您需要调整输入以便 oracle 识别它。希望 下面的 sn-p 可以帮助你。

  SET SERVEROUTPUT ON;
DECLARE
  lv_input VARCHAR2(100):='2016-02-15T18:30:00.000Z';
  lv_date  TIMESTAMP;
  lv_out_req VARCHAR2(100 CHAR);
BEGIN
  SELECT TO_TIMESTAMP(REPLACE(REPLACE(lv_input,'T',' '),'Z',''),'YYYY-MM-DD HH24:MI:SS.FF6')
  INTO lv_date
  FROM DUAL;
  dbms_output.put_line('Input varchar '||lv_input||' --> '||lv_date);
  lv_out_req:=to_char(lv_date,'mm/dd/yyyy hh24:mi:ss');
  dbms_output.put_line('Out formated varchar '||lv_out_req);
END;

---------------------------------OUTPUT--------------------------------------
PL/SQL procedure successfully completed.

Input varchar 2016-02-15T18:30:00.000Z --> 02/15/2016 18:30:00.000000
Out formated varchar 02/15/2016 18:30:00

---------------------------------------------------------------------------

【讨论】:

  • 当我运行你的代码时,我得到了 Input varchar 2016-02-15T18:30:00.000Z --> 15-FEB-16 06.30.00.000000 PM 作为输出.当我更改日期格式以满足我的要求时,我收到 Not a valid month 错误消息。代码:SELECT TO_TIMESTAMP(REPLACE(REPLACE(project_launch_date,'T',''),'Z',''),'MM/DD/YYYY HH24:MI:SS.FF6') INTO lv_date FROM DUAL;
  • 请检查输入和每个使用格式掩码。这是您指定的格式掩码的问题。
【解决方案3】:

尝试在 Oracle 中执行此操作:

select to_char(to_timestamp('2016-02-15T18:30:00.000Z','YYYY-MM DD"T"HH24:MI:SS.ff3"Z"'),'DD/MM/YYYY HH24:MI:SS AM') from dual

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2017-06-07
    • 2022-01-23
    • 2013-08-18
    相关资源
    最近更新 更多