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



我有一个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')

我写对了吗?

也许……在Oracle中,DATE是一种二进制数据类型,由7个字节组成,分别表示世纪、年月日、月、日、时、分和秒,并且ALWAYS有这些成分;然而,许多用于访问数据库的客户端应用程序默认不显示时间组件,而只显示日期组件(但是时间组件即使被隐藏也仍然存在)。

您可以更改这些客户端应用程序以显示整个日期/时间。对于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)上使用基于函数的索引,所以最好不要使用这种方法,如果可以的话,最好养成在列上直接使用日期范围的习惯。

最新更新