SQL:在退货期之前检查日期是否按时付款

Kar*_*hik 3 sql snowflake-cloud-data-platform

SQL:检查付款日期是否在退货期后下个月的19号之前

\n

要求是确定OnTime Payment \'Y\'/\'N\'

\n
\xe2\x80\xa2 If monthly = PAID before the 19th of the month following the return period\nExample: Jan-Jan payment deadline = Feb 19\n\xe2\x80\xa2 If quarterly = paid before the 16th of the 2nd month following the return period\nExample: Jan-Mar payment deadline = May 16\n\xe2\x80\xa2 If last quarterly = paid before the 30th of the month following the return period\nExample: Oct-Dec payment deadline = Jan 30\n
Run Code Online (Sandbox Code Playgroud)\n

对于季度,如果是最后一个季度,则在下个月的 30 日支付,对于季度月的其余时间,则在该月的 16 日支付

\n
with data as (\n    select \'Sep-Sep2021\' AS PERIOD,\n           \'2021-10-11 22:09:45\' AS DT,\n           \'PAID\' AS STATUS\n    union all\n    select \'Sep-Sep2021\' AS PERIOD,\n           \'2021-10-20 22:09:45\' AS DT,\n           \'PAID\' AS STATUS\n    union all\n    select \'Jan-Mar2021\'AS PERIOD,\n           \'2021-04-11 22:09:45\'AS DT,\n           \'PAID\'\n    union all\n    select \'Jan-Mar2021\'AS PERIOD,\n           \'2021-05-20 22:09:45\'AS DT,\n           \'PAID\'\n    union all\n    select \'Jan-Jan2021\'AS PERIOD,\n           \'2021-02-11 22:09:44\'AS DT,\n           \'PAID\'AS STATUS\n    union all\n    select \'Sep-Sep2021\'AS PERIOD,\n           \'2021-10-12 04:10:00\'AS DT,\n           \'CANCELLED\'AS STATUS\n    union all \n    select \'Jul-Sep2021\'AS PERIOD,\n           \'2021-10-12 04:10:00\'AS DT,\n           \'PAID\' STATUS\n    union all \n    select \'Oct-Dec2021\'AS PERIOD,\n           \'2022-01-29 04:10:00\'AS DT,\n           \'PAID STATUS\n)\nselect * from data;\n
Run Code Online (Sandbox Code Playgroud)\n

预期结果

\n

在此输入图像描述

\n

CMe*_*CMe 5

编辑后添加了最后一季的作者

select
    period,
    CASE
        WHEN REGEXP_COUNT(period,SUBSTR(period,1,3)) = 2 THEN 'monthly'
        WHEN REGEXP_COUNT(period,SUBSTR(period,1,3)) = 1 AND SUBSTR(period,1,3) = 'Oct' THEN 'quaterly_last'
        ELSE 'quaterly'
    END AS payment_type,
    CASE payment_type
        WHEN 'monthly' THEN DATEADD('month', 1, TO_DATE('19'||SUBSTR(period,5), 'DDMonYYYY'))
        WHEN 'quaterly' THEN DATEADD('month', 2, TO_DATE('16'||SUBSTR(period,5), 'DDMonYYYY'))
        WHEN 'quaterly_last' THEN DATEADD('month', 1, TO_DATE('30'||SUBSTR(period,5), 'DDMonYYYY'))
    END AS payment_deadline,
    dt,
    status,
    CASE
        WHEN status != 'PAID' THEN NULL
        WHEN dt < payment_deadline  THEN 'Y'
        WHEN dt >= payment_deadline THEN 'N'
    END AS on_time_payment
FROM data
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述