【问题标题】:Update with filter on timestamp使用时间戳过滤器更新
【发布时间】:2020-02-19 14:52:38
【问题描述】:

在没有 sql oracle 活动的几年之后...我正在尝试按日期更新 oracle SQL 上的某些状态代码。 日期为法文格式 DD/MM/YYYY

date_start 列上的格式是时间戳,格式为“18/10/2019 23:15:26”,我需要在日期 -1 月进行过滤。并使用 sqlplus...

我是这样想的:

UPDATE contexte_ihm 
SET set status_code =1000 status_name = (select FLUX_STATUS_NAME from flux_status_ref where FLUX_STATUS_CD=1000)
WHERE status_code=9999 
AND DATE_START = TO_TIMESTAMP( '31/01/2000 08-00-00', 'DD/MM/YYYY HH24-MI-SS' )

我试过这个:

SELECT * FROM contexte_ihm WHERE status_code =1000 AND DATE_START =to_date('19/12/2019','dd/mm/yyyy')
  2  ;

no rows selected

<NOW()-30 NOW 是无效标识符...

我需要将 95000 行从一个月前更新到更早的日期...

【问题讨论】:

  • 日期或时间戳没有格式;默认情况下,您的客户端使用您的 NLS 设置将内部表示格式化为人类可读的内容。而now() 不是Oracle 函数;等效为sysdatecurrent_date

标签: sql oracle sql-update


【解决方案1】:

听起来您想要一个日期范围。我认为:

WHERE status_code = 9999 AND
      date_start < trunc(sysdate, 'MON') - interval '1 month' and
      date_start >= timestamp '2000-01-31 08:00:00';

您应该在SELECT 上测试WHERE 子句,以确保它获得正确的行。

【讨论】:

    【解决方案2】:

    我试过了,但出了点问题:

    SQL> SELECT date_start, date_end FROM contexte_ihm
    WHERE status_code = 9999 AND date_start < trunc(sysdate, 'MON') - interval '1 month' 
    AND date_start >= timestamp '31/01/2000 08:00:00';
    
    ORA-30089: <datetime field> missing or invalid
    

    我尝试使用 / 分隔符进行日期时间,因为它是这样的:

    DATE_START          DATE_END
    ------------------- -------------------
    16/11/2019 15:04:54
    

    您给出的原始命令返回相同的错误。

    SQL>desc contexte_ihm
     DATE_START  NOT NULL TIMESTAMP(6)
     DATE_END   TIMESTAMP(6)
     DATE_STATUS NOT NULL TIMESTAMP(6)
    

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多