此过程适用于第一次约会,但它不会从第二次约会中删除任何符合要求的内容
Posted
技术标签:
【中文标题】此过程适用于第一次约会,但它不会从第二次约会中删除任何符合要求的内容【英文标题】:This procedure works great for the first date but it doesn't remove anything matching the requirement from the second date 【发布时间】:2021-05-19 13:04:41 【问题描述】:DELETE FROM HERAPERM.SCRUBLITST
WHERE
COALESCE
(
SUBSTR (ODUDAT, 1, 2) || SUBSTR (ODUDAT, 3, 2) || SUBSTR (ODUDAT, 5, 2)
, SUBSTR (ODCDAT, 1, 2) || SUBSTR (ODCDAT, 3, 2) || SUBSTR (ODCDAT, 5, 2)
) > TO_CHAR (CURRENT_DATE - 2 MONTHS, 'MMDDYY');
ODUDAT 最后一次使用。第二个日期是 ODCDAT,它是创建日期。数据格式为 MMDDYY。我需要删除上次使用日期早于两个月的日期行。如果文件是在过去两个月内创建但未使用,则需要将其保留在文件中。该文件包含 6893 行。当我使用上述内容时,我得到 536 行。它从 ODUDAT 中删除旧项目,但不触及 ODCDAT。此外,如果 ODUDAT 为空,则它恢复为 ODUDAT。我不确定如何在代码中处理它。
样本数据 A210407001 *FILE DDMF 040821 BYOD_00003 *FILE PF 021521 021621 DPI2194LO1 *FILE LF 041221 DPI2194LO2 *FILE LF 041221 DSLAMPORT1 *FILE PF 021521 021521 FIXPHYADR1 *FILE LF 042021
【问题讨论】:
不清楚你说的第二个日期是什么意思,请提供样本数据和期望的输出 ODUDAT 最后一次使用。第二个日期是 ODCDAT,它是创建日期。数据格式为 MMDDYY。我需要删除上次使用日期超过两个月的日期行。如果文件是在过去两个月内创建但未使用,则需要将其保留在文件中。该文件包含 6893 行。当我使用上述内容时,我得到 536 行。它会从 ODUDAT 中删除旧项目,但不会触及 ODCDAT。 A210407001 *FILE DDMF 040821 BYOD_00003 *FILE PF 021521 021621 DPI2194LO1 *FILE LF 041221 DPI2194LO2 *FILE LF 041221 DSLAMPORT1 *FILE PF 021521 021521 FIX 编辑您的问题并在其中添加这些信息而不是 cmets,很难跟进 cmets 不使用时,你的数据里有什么,是空还是空? 【参考方案1】:DELETE FROM HERAPERM.SCRUBLITST
WHERE
COALESCE
(
NULLIF
(
SUBSTR (ODUDAT, 5, 2) || SUBSTR (ODUDAT, 1, 4)
, ''
)
, SUBSTR (ODCDAT, 5, 2) || SUBSTR (ODCDAT, 1, 4)
) < TO_CHAR (CURRENT_DATE - 2 MONTHS, 'YYMMDD');
您使用这些 SUBSTR 将列中日期的 MMDDYY
表示形式(如数据示例中所示)转换为 YYMMDD
。然后将其与当前日期减去 2 个月的相同字符串表示形式进行比较。如果您需要删除日期较早的行,您需要<
。
这里是dbfiddle 与具有相同 WHERE 子句的 SELECT 语句的链接(即它选择应该删除的行)。您可以编辑链接中的示例,其中一些新的示例数据指向某行,该行要么被错误删除,要么未被删除。
【讨论】:
在此代码中,当它符合条件时如何添加?上面的代码删除了所有的记录。 如果第一列中有空白 ('') 或 NULL 值(而不仅仅是 NULL),则必须使用 NULLIF 函数修改查询。逻辑是:如果 ODUDAT 为 NULL 或空白,则使用 ODCDAT。如果后者也可以为空,并且您不想触摸这样的行,那么也将其表达式包装到 NULLIF 中。这个逻辑应该适用于您的描述。如果不是,则使用 2 列表格的数据样本编辑您的问题,并显示哪些行必须删除,哪些行不能删除。 我将添加数据样本。 我运行了该代码,它确实删除了 540,但它与我需要的相反。例如,所有上次使用的日期 051821 仍在文件中,这些是我需要删除的日期。我从来没有听说过 dbfiddle 谢谢你的链接。 您与问题中提供的您自己的条件相矛盾:“我需要删除上次使用日期超过两个月的日期行”。 “051821”不早于(早于)2 个月。为什么要删除?以上是关于此过程适用于第一次约会,但它不会从第二次约会中删除任何符合要求的内容的主要内容,如果未能解决你的问题,请参考以下文章