使用时间戳过滤器更新
Posted
技术标签:
【中文标题】使用时间戳过滤器更新【英文标题】: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 函数;等效为sysdate
或current_date
。
【参考方案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)
【讨论】:
以上是关于使用时间戳过滤器更新的主要内容,如果未能解决你的问题,请参考以下文章