使用时间戳过滤器更新

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 函数;等效为sysdatecurrent_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)

【讨论】:

以上是关于使用时间戳过滤器更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas query() 过滤时间戳列上的数据帧

按当前时间戳的 GraphQL 查询过滤器

时间戳范围之间的 AWS Appsync 订阅过滤器

带有时间戳的 Django 过滤器模型

带你掌握Vue过滤器filters及时间戳转换

三分钟掌握Vue过滤器filters及时间戳转换