仅删除 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:01
和 2022-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 索引,因此最好不要如果可以,请使用此方法并养成直接在列上使用日期范围的习惯。
我有一个 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:01
和 2022-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 索引,因此最好不要如果可以,请使用此方法并养成直接在列上使用日期范围的习惯。