【问题标题】:How to add column A (date column) to Column B ( number of business days) in teradata to get the new date?如何在 teradata 中将 A 列(日期列)添加到 B 列(工作日数)以获取新日期?
【发布时间】:2015-02-22 01:53:19
【问题描述】:

这是我的数据;

table A.pickup_date 是一个日期列

表 A.biz_days 是我要加到 A.pickup_date 的工作日

表 B.date

表 B.is_weekend(是或否)

表 B.is_holiday(是或否)

基本上从表 B 中,我知道每个日期,如果任何日期是工作日或不是。现在我想在 A.pickup_date 中添加 A.business_days 后的确切日期在表 A 中的第三列。

谁能为此提供case when 语句或procedure 语句?不幸的是,我们不允许在 Teradata 中编写自己的函数。

【问题讨论】:

  • 你试过什么?您是否有示例代码向我们展示您遇到的问题?
  • 我只是不知道如何在这里编写一个循环,可能在一个过程中将 python 逻辑实现为 def date_by_adding_business_days(from_date, add_days): business_days_to_add = add_days current_date = from_date while business_days_to_add > 0: current_date += datetime.timedelta(days=1) weekday = current_date.weekday() if weekday >= 5: # sunday = 6 continue business_days_to_add -= 1 return current_date

标签: loops date teradata procedure


【解决方案1】:

这非常丑陋,但我认为它应该让你开始。

首先我创建了一个 volatile 表来表示您的表 a:

CREATE VOLATILE TABLE vt_pickup AS
(SELECT CURRENT_DATE AS pickup_date,
8 AS Biz_Days) WITH DATA PRIMARY INDEX(pickup_date)
ON COMMIT PRESERVE ROWS;

INSERT INTO vt_pickup VALUES ('2015-02-24',5);

然后我加入了 sys_calendar.calendar 以获取一周中的日期:

CREATE VOLATILE TABLE VT_Days AS 
(
SELECT
            p.pickup_date,
            day_of_week
            FROM

            vt_pickup p
            INNER JOIN sys_calendar.CALENDAR c
            ON c.calendar_date >= p.pickup_date 
            AND c.calendar_date < (p.pickup_date + Biz_Days)
) WITH DATA 
PRIMARY INDEX(pickup_date)
ON COMMIT PRESERVE ROWS

然后我可以使用所有这些来生成实际的交货日期:

SELECT 
p.pickup_date,
p.biz_days,
biz_days + COUNT(sundays.day_of_week) + COUNT (saturdays.day_of_week) AS TotalDays,
COUNT (sundays.day_of_week) AS Suns,
COUNT (saturdays.day_of_week) AS Sats,
p.pickup_date + totaldays AS Delivery_Date,
FROM 
    vt_pickup p
    LEFT JOIN vt_days AS Sundays ON
         p.pickup_date = sundays.pickup_date
         AND sundays.day_of_week = 1
        LEFT JOIN vt_days AS saturdays ON
            p.pickup_date = saturdays.pickup_date
            AND saturdays.day_of_week = 7
GROUP BY 1,2

您应该能够将逻辑与另一个别名一起用于您的假期。

【讨论】:

  • 谢谢安德鲁!我明白你的逻辑。但我认为这不会准确工作,因为如果“COUNT(sundays.day_of_week) + COUNT (saturdays.day_of_week)”是一个相当大的数字,比如 10?那我还需要在10年内排除那些非商业的日子,好像是一个无限循环。
【解决方案2】:

最简单的方法是计算连续的工作日数(如果是重复操作,则将其作为新列添加到日历表中,否则使用 WITH):

SUM(CASE WHEN is_weekend = 'Y' OR is_holiday = 'Y' THEN 0 ELSE 1 END)
OVER (ORDER BY calendar_date
      ROWS UNBOUNDED PRECEDING) AS biz_day#

那么你需要两个连接:

SELECT ..., c2.calendar_date 
FROM tableA AS a 
JOIN tableB AS c1
  ON a.pickup_date = c1.calendar_date
JOIN tableB AS c2
  ON c2.biz_day# = c1.biz_day# + a.biz_days 
 AND is_weekend = 'N'
 AND is_holiday = 'N'

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 2023-03-21
    • 2021-05-30
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多