【问题标题】:Tenure Calculation with TeraData SQL使用 TeraData SQL 计算任期
【发布时间】:2020-06-08 11:14:07
【问题描述】:
  • 列表项

我一直很难将此 T-SQL 转换为 TeraData SQL。有人可以帮我解决这个问题。我真的很喜欢它。我不了解日期与 teradata 的转换。我很困惑。

财政月示例:开始:2020-22-01 - 结束:2020-21-01 此查询在他们从那里开始位置的财政月内提供数据结果。示例:2019 年 8 月 21 日


   ,CASE WHEN DAY(POSITION_START_DT) BETWEEN 22 AND 31 
         THEN CAST(
               CONCAT(
               CAST(YEAR(POSITION_START_DT)AS VARCHAR(4)),
               CASE WHEN LEN(MONTH(POSITION_START_DT)) = 1 THEN '-0' ELSE '-'END,
               CAST(MONTH(POSITION_START_DT)AS VARCHAR(2)),
               '-21') 
               AS date)

          WHEN DAY(POSITION_START_DT) BETWEEN 1 AND 6 
          THEN CAST(
               CONCAT(
               CAST(YEAR(DATEADD(MONTH,-1,POSITION_START_DT))AS VARCHAR(4)),
               CASE WHEN LEN(MONTH(DATEADD(MONTH,-1,POSITION_START_DT))) = 1 THEN '-0' ELSE '-'END,
               CAST(MONTH(DATEADD(MONTH,-1,POSITION_START_DT))AS VARCHAR(2)),
               '-21') 
           AS date) 

         ELSE CAST(
               CONCAT(
                   CAST(YEAR(DATEADD(MONTH,0,POSITION_START_DT))AS VARCHAR(4)),
                   CASE WHEN LEN(MONTH(DATEADD(MONTH,0,POSITION_START_DT))) = 1 THEN '-0' ELSE '-'END,
                   CAST(MONTH(DATEADD(MONTH,0,POSITION_START_DT))AS VARCHAR(2)),
                   '-21')
               AS date) END AS FISCAL_START_MONTH_INSALES

Fiscal Tenure Bucket 使用“Fiscal_Start_Month_insales”字段并将员工分组到一个存储桶中。 桶: - 0_3_MONTHS - 4_6_MONTHS - 7_12_MONTHS - 13_24_MONTHS - 25_PLUS_MONTHS - 其他未知


    ,CASE  WHEN DATEDIFF(Day,FiscalStartMonthInSales,CURRENT_DATE)/30  >= 25 THEN '25_PLUS_MONTHS'
                       WHEN DATEDIFF(Day,FiscalStartMonthInSales,CURRENT_DATE)/30  BETWEEN 13 AND 24 THEN '13_24_MONTHS'
                       WHEN DATEDIFF(Day,FiscalStartMonthInSales,CURRENT_DATE)/30  BETWEEN 7 AND 12 THEN '7_12_MONTHS'
                       WHEN DATEDIFF(Day,FiscalStartMonthInSales,CURRENT_DATE)/30  BETWEEN 4 AND 6 THEN '4_6_MONTHS'
                       WHEN DATEDIFF(Day,FiscalStartMonthInSales,CURRENT_DATE)/30  BETWEEN 0 AND 3 THEN '0_3_MONTHS'
                       ELSE 'Unknown' END as PositionTenureBucket

干杯~ 阿伦

【问题讨论】:

  • 样本数据、期望的结果以及对预期逻辑的解释会增加您获得帮助的机会。
  • 公平,让我在更多内容时编辑。
  • 您似乎编辑了问题,但仍然没有示例数据和所需结果。这将非常有帮助,因为仅从代码中并不清楚确切的计算是什么。那个 tsql 非常复杂,介于解析、转换和数学之间。我迷路了。
  • 也不清楚你的问题到底是什么。如果可以,请尝试并简化。
  • 这是我的最佳猜测:“我想获取员工开始日期和今天之间的月数,其中月份由我们的财政期间划定,从每月 21 日开始到结束下个月 20 日”。我相信类似的东西:SELECT COUNT(PERIOD(DATE '2018-01-01', CURRENT_DATE) P_INTERSECT fiscpers.fiscal_period) FROM (SELECT PERIOD(calendar_date, calendar_date + INTERVAL '1' MONTH) as fiscal_period FROM Sys_Calendar."CALENDAR" WHERE day_of_month = 21) AS fiscpers 如果是这样的话,会让你进入球场。 (其中2018-01-01 是员工起点)

标签: sql teradata teradata-sql-assistant aqua-data-studio


【解决方案1】:

将 Fred 的第一部分简化为:

Cast(To_Char(CASE WHEN Extract(DAY From POSITION_START_DT) BETWEEN 1 AND 6 
                  THEN Add_Months(POSITION_START_DT,-1)
                  ELSE POSITION_START_DT
             END, 'yyyy-mm') || '-21' AS DATE) 

并将逻辑简化为减去 6 天,得到当月的 1 号并加上 20 天

Trunc(POSITION_START_DT - 6, 'mon') + 20

【讨论】:

    【解决方案2】:

    只是转换函数(并结合似乎给出相同结果的两种情况),似乎第一部分可能是

    CASE WHEN EXTRACT(DAY FROM POSITION_START_DT) BETWEEN 1 AND 6
         THEN CAST(CAST(CAST(ADD_MONTHS(POSITION_START_DT,-1) AS FORMAT 'YYYY-MM') AS VARCHAR(7))||'-21' AS DATE FORMAT 'YYYY-MM-DD')
         ELSE CAST(CAST(CAST(POSITION_START_DT AS FORMAT 'YYYY-MM') AS VARCHAR(7))||'-21' AS DATE FORMAT 'YYYY-MM-DD')
         END AS FISCAL_START_MONTH_INSALES
    

    也许第二部分只是

     ,CASE WHEN (CURRENT_DATE-FiscalStartMonthInSales)/30  >= 25 THEN '25_PLUS_MONTHS'
           WHEN (CURRENT_DATE-FiscalStartMonthInSales)/30   BETWEEN 13 AND 24 THEN '13_24_MONTHS'
           WHEN (CURRENT_DATE-FiscalStartMonthInSales)/30   BETWEEN 7 AND 12 THEN '7_12_MONTHS'
           WHEN (CURRENT_DATE-FiscalStartMonthInSales)/30   BETWEEN 4 AND 6 THEN '4_6_MONTHS'
           WHEN (CURRENT_DATE-FiscalStartMonthInSales)/30   BETWEEN 0 AND 3 THEN '0_3_MONTHS'
           ELSE 'Unknown' END as PositionTenureBucket
    

    【讨论】:

    • 我收到一个语法错误:预期在 ')' 和 '"||"' 之间有一些内容用于顶级语法转换。有什么想法吗?
    • 括号错误。我将原则上编辑答案。但是 dnoeth's 更简单。
    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 2017-05-09
    • 2015-01-10
    • 2016-09-15
    • 2016-01-24
    • 2023-03-23
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多