Oracle中的小时格式

时间:2013-02-19 12:59:22

标签: sql oracle oracle-apex type-conversion

我正在尝试使用名为START_TIME和END_TIME的列在oracle应用程序构建器中创建一个表单。

现在,当我尝试查看表单时,我只能将其视为日期,不能输入任何HOURS或MINUTES。

我的表格构建如下:

CREATE TABLE  "MACHINE_SCHEDULE" 
   (    "SCHEDULE_NUMBER" VARCHAR2(100 CHAR), 
    "MACHINE_NO" VARCHAR2(10 CHAR), 
    "MACHINE_USE_DATE" DATE, 
    "START_TIME" DATE, 
    "END_TIME" DATE, 
    "PROCESS" VARCHAR2(164 CHAR), 
    "BATCH_NO" VARCHAR2(10 CHAR), 
    "MATERIAL_BAR_NO" NUMBER(8,0), 
    "TECHNICIAN_STAFF_NO" VARCHAR2(15 CHAR), 
     CONSTRAINT "MACHINE_SCHEDULE_PK" PRIMARY KEY ("SCHEDULE_NUMBER") ENABLE
   )
/
ALTER TABLE  "MACHINE_SCHEDULE" ADD CONSTRAINT "MACHINE_SCHEDULE_CON" FOREIGN KEY ("TECHNICIAN_STAFF_NO")
      REFERENCES  "MODULE_TECHNICIAN" ("TECHNICIAN_STAFF_NO") ENABLE
/
ALTER TABLE  "MACHINE_SCHEDULE" ADD CONSTRAINT "MACHINE_SCHEDULE_FK" FOREIGN KEY ("BATCH_NO")
      REFERENCES  "BATCH" ("BATCH_NO") ENABLE
/
ALTER TABLE  "MACHINE_SCHEDULE" ADD CONSTRAINT "MACHINE_SCHEDULE_FK2" FOREIGN KEY ("MATERIAL_BAR_NO")
      REFERENCES  "MATERIAL_BAR" ("MATERIAL_BAR_NO") ENABLE
/

CREATE OR REPLACE TRIGGER  "BI_MACHINE_SCHEDULE" 
  before insert on "MACHINE_SCHEDULE"               
  for each row  
begin   
  if :NEW."SCHEDULE_INSTANT_NUMBER" is null then 
    select "MACHINE_SCHEDULE_SEQ".nextval into :NEW."SCHEDULE_INSTANT_NUMBER" from dual; 
  end if; 
end; 

/
ALTER TRIGGER  "BI_MACHINE_SCHEDULE" DISABLE
/

我无法修改DATE

我的表单使用以下来源:

select 
"SCHEDULE_NUMBER",
"SCHEDULE_NUMBER" SCHEDULE_NUMBER_DISPLAY,
"MACHINE_NO",
"MACHINE_USE_DATE",
"START_TIME" as b,
TO_CHAR(b, 'HH24:MI:SS'),
"END_TIME",
"PROCESS",
"BATCH_NO",
"MATERIAL_BAR_NO",
"TECHNICIAN_STAFF_NO"
from "#OWNER#"."MACHINE_SCHEDULE"

然而它给了erorr:

  

“无法在Builder中解析查询。如果您相信自己的查询   在语法上是正确的,请检查下面的“通用列”复选框   区域源在不解析的情况下继续进行。 ORA-00904:“B”:无效   标识符“

如果我将'b'变量更改为START_TIME,则会出现错误:

  

查询列#5(TO_CHAR(“START_TIME”,'HH24:MI:SS'))无效,请使用   列别名

3 个答案:

答案 0 :(得分:1)

当我们在select语句中使用表达式时,Oracle使用表达式派生标识符,因为投影中的每个列必须具有唯一的名称。检查SQL * Plus中的列标题以查看此操作。

但是有些客户端不喜欢这些派生标识符,并希望获得符合Oracle命名约定的好名称。看来,Forms Builder就是这样一个工具。

这样的错误信息,

query column #5 (TO_CHAR("START_TIME",'HH24:MI:SS')) is invalid, use column alias

告诉你给表达式一个别名,即

"START_TIME" ,
TO_CHAR("START_TIME", 'HH24:MI:SS') as b,

只有我建议您使用更有意义的内容,例如START_TIME_FMT。


  

我无法在新列中输入任何细节。它显示为“NULL”

我认为这种行为是因为它是派生字段。因此,您需要做的是从查询中删除它并使用非表项。当您从数据库中检索记录时,使用格式化的START_TIME填充它,并在插入或更新后使用触发器将其值复制到(隐藏的)START_TIME列。

答案 1 :(得分:0)

另外:

-- This will never work --
SELECT SYSDATE as b, to_char(b, 'HH24:MI:SS') tme
 FROM dual
/

Output: ORA-00904: "B": invalid identifier


-- This will work --
SELECT to_char(b, 'HH24:MI:SS') tme
  FROM
 (
  SELECT SYSDATE as b
    FROM dual
 )
/

Output: 10:09:02

答案 2 :(得分:0)

围绕TO_CHAR中字段的双引号会导致问题。事实上,你不需要任何一个。 APEX中的查询构建器对双引号有点生气!

试试这个:

select 
SCHEDULE_NUMBER,
SCHEDULE_NUMBER SCHEDULE_NUMBER_DISPLAY,
MACHINE_NO,
MACHINE_USE_DATE,
START_TIME as b,
TO_CHAR(START_TIME,'HH24:MI:SS'),
END_TIME,
PROCESS,
BATCH_NO,
MATERIAL_BAR_NO,
TECHNICIAN_STAFF_NO
from #OWNER#.MACHINE_SCHEDULE