仅删除 2022 年 5 月 6 日至 5 月 18 日之间的数据

delete data only between may 6 and may 18, 2022

我有一个 table 有 CLIENT_CONTACT 数据,其中有从 2020 年到今天的通话数据。

如何只删除2022年5月6日至5月18日之间的数据,我写对了吗?

DELETE FROM CLIENT_CONTACT
WHERE rep_date >= TO_DATE('06.05.2022', 'dd.mm.yyyy') AND rep_date <= TO_DATE('18.05.2022', 'dd.mm.yyyy')

did I write correctly?

Maybe....在Oracle中,DATE是一个二进制数据类型,由7个字节组成,代表世纪,year-of-century,月,日,时,分,秒,它ALWAYS 有那些组件;然而,许多用于访问数据库的客户端应用程序会默认不显示时间组件,只显示日期组件(但即使隐藏了时间组件,它仍然存在)。

您可以更改这些客户端应用程序以显示整个 date/time。对于 SQL*Plus 和 SQL Developer,您可以使用:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

你所写的相当于:

DELETE FROM CLIENT_CONTACT
WHERE  rep_date >= TIMESTAMP '2022-05-06 00:00:00'
AND    rep_date <= TIMESTAMP '2022-05-18 00:00:00'

如您所见,如果有任何行介于 2022-05-18 00:00:012022-05-18 23:59:59 之间,那么它们将不会被删除。

如果您的 rep_date 列仅包含午夜的时间组件,那么您的代码将起作用。


如果您确实想删除 2022-05-18 上任何时间的所有行,那么您需要使用:

DELETE FROM CLIENT_CONTACT
WHERE  rep_date >= TO_DATE('06.05.2022', 'dd.mm.yyyy')
AND    rep_date <  TO_DATE('19.05.2022', 'dd.mm.yyyy')

您也可以使用 DATE 字面量来编写它:

DELETE FROM CLIENT_CONTACT
WHERE  rep_date >= DATE '2022-05-06'
AND    rep_date <  DATE '2022-05-19'

TIMESTAMP字面量:

DELETE FROM CLIENT_CONTACT
WHERE  rep_date >= TIMESTAMP '2022-05-06 00:00:00'
AND    rep_date <  TIMESTAMP '2022-05-19 00:00:00'

或者,如果你想传入18.05.2022那么你可以添加一天:

DELETE FROM CLIENT_CONTACT
WHERE  rep_date >= TO_DATE('06.05.2022', 'dd.mm.yyyy')
AND    rep_date <  TO_DATE('18.05.2022', 'dd.mm.yyyy') + INTERVAL '1' DAY

DELETE FROM CLIENT_CONTACT
WHERE  rep_date >= TO_DATE('06.05.2022', 'dd.mm.yyyy')
AND    rep_date <  TO_DATE('18.05.2022', 'dd.mm.yyyy') + 1

您也可以使用您的代码,但将 rep_date 包装在 TRUNC 函数中以将时间组件截断回午夜:

DELETE FROM CLIENT_CONTACT
WHERE  TRUNC(rep_date) >= TO_DATE('06.05.2022', 'dd.mm.yyyy')
AND    TRUNC(rep_date) <= TO_DATE('18.05.2022', 'dd.mm.yyyy')

但是,这将无法在 rep_date 列上使用索引,您需要在 TRUNC(rep_date) 上使用 function-based 索引,因此最好不要如果可以,请使用此方法并养成直接在列上使用日期范围的习惯。