【问题标题】:How to use SUBSTR in update query如何在更新查询中使用 SUBSTR
【发布时间】:2018-10-23 19:37:38
【问题描述】:

我在 working_hour 列中有以下更新查询时间即将到来 +000000000 01:14:00.771000000 这种格式但我想显示时间 01:14:00 格式只是为了尝试使用 SUBSTR 但是它给了我 ORA-00927: 缺少等号错误 这是我的查询

UPDATE  EMPLOYEE_LOGIN_TIME T1 SET SUBSTR(T1.WORKING_HOUR,12,8)=
(SELECT TO_TIMESTAMP (TO_CHAR(TIME_OUT))- TO_TIMESTAMP (TO_CHAR(TIME_IN)) AS WORKING_HOUR 
FROM EMPLOYEE_LOGIN_TIME T2 WHERE TRUNC(PUNCH_DATE)=TRUNC(SYSDATE)) WHERE T1.EMPLOYEE_ID='73584' AND TRUNC(T1.PUNCH_DATE)=TRUNC(SYSDATE)

我的表结构如下:

TIME_IN         TIMESTAMP(6) WITH LOCAL TIME ZONE
TIME_OUT            TIMESTAMP(6) WITH LOCAL TIME ZONE
WORKING_HOUR        VARCHAR2(30 BYTE)
PUNCH_DATE          DATE
TIME_OUT_HISTORY    VARCHAR2(200 BYTE)

【问题讨论】:

  • 您必须单独分配给一个。例如。 ... SET WORKING_HOUR = ...
  • UPDATE EMPLOYEE_LOGIN_TIME T1 SET T1.WORKING_HOUR=SUBSTR(T1.WORKING_HOUR,12,8) (SELECT TO_TIMESTAMP (TO_CHAR(TIME_OUT))- TO_TIMESTAMP (TO_CHAR(TIME_IN)) 作为 WORKING_HOUR FROM EMPLOYEE_LOGIN_TIME T2 WHERE TRUNC (PUNCH_DATE)=TRUNC(SYSDATE)) WHERE T1.EMPLOYEE_ID='73584' AND TRUNC(T1.PUNCH_DATE)=TRUNC(SYSDATE) 我在上面做了,但给了我 SQL 错误:ORA-00936: missing expression
  • 声明看起来很奇怪。为什么你在你的日期时间列上调用to_char 只是为了应用to_timestamp 呢?为什么不简单地time_out - time_in?然后在您的子查询中,无论哪个员工,您都选择了所有带有 punch_date = today 的记录。但是更新语句中的此类子查询应该恰好返回一行。请解释并展示一些示例记录和预期结果,以便我们了解您实际想要达到的目标。
  • 你离那里很远。从基本更新开始。采取小步骤直到完成。
  • @ThorstenKettner:我正在创建一个应用程序,当用户登录时,用户可以在其中登录和注销,登录时间将插入数据库中的 time_in 列,当注销用户注销详细信息将输入 time_out 列现在我想找到它们之间的差异,差异是正确的 +000000000 01:14:00.771000 这种格式,但我想要 01:14:00 这种格式输出

标签: sql oracle sql-update substring


【解决方案1】:

TIMESTAMP - TIMESTAMP 给出INTERVAL DAY TO SECOND 结果(不是字符串) - 只需将其添加到纪元数据并使用TO_CHAR 获取时间组件:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE EMPLOYEE_LOGIN_TIME(
  EMPLOYEE_ID         INTEGER,
  TIME_IN             TIMESTAMP(6) WITH LOCAL TIME ZONE,
  TIME_OUT            TIMESTAMP(6) WITH LOCAL TIME ZONE,
  WORKING_HOUR        VARCHAR2(30 BYTE),
  PUNCH_DATE          DATE,
  TIME_OUT_HISTORY    VARCHAR2(200 BYTE)
);

INSERT INTO EMPLOYEE_LOGIN_TIME ( 
  EMPLOYEE_ID,
  TIME_IN,
  TIME_OUT,
  WORKING_HOUR,
  PUNCH_DATE,
  TIME_OUT_HISTORY
)
SELECT 73584,
       SYSTIMESTAMP,
       SYSTIMESTAMP + INTERVAL '+000000000 01:14:00.771000000' DAY TO SECOND,
       NULL,
       SYSDATE,
       NULL
FROM   DUAL;

查询 1

UPDATE  EMPLOYEE_LOGIN_TIME
SET WORKING_HOUR = TO_CHAR( 
                     DATE '0001-01-01' + ( TIME_OUT- TIME_IN ),
                     'HH24:MI:SS'
                   )
WHERE  EMPLOYEE_ID= 73584
AND    PUNCH_DATE >= TRUNC(SYSDATE)
AND    PUNCH_DATE <  TRUNC(SYSDATE) + INTERVAL '1' DAY;

查询 2

SELECT EMPLOYEE_ID,
       TO_CHAR( TIME_IN,  'YYYY-MM-DD HH24:MI:SS.FF6 TZR' ) AS TIME_IN,
       TO_CHAR( TIME_OUT, 'YYYY-MM-DD HH24:MI:SS.FF6 TZR' ) AS TIME_OUT,
       WORKING_HOUR,
       PUNCH_DATE,
       TIME_OUT_HISTORY
FROM   EMPLOYEE_LOGIN_TIME;

结果

| EMPLOYEE_ID |                        TIME_IN |                       TIME_OUT | WORKING_HOUR |          PUNCH_DATE | TIME_OUT_HISTORY |
|-------------|--------------------------------|--------------------------------|--------------|---------------------|------------------|
|       73584 | 2018-05-14 09:00:00.000000 PST | 2018-05-14 10:14:00.771000 PST |     01:14:00 | 2018-05-14 09:00:00 |           (null) |

【讨论】:

  • 是的!这就是我正在寻找的答案谢谢@MT0 非常感谢
猜你喜欢
  • 2018-03-08
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多