使用TeradataSQL进行任期计算 列表项

使用TeradataSQL进行任期计算 列表项,sql,teradata,teradata-sql-assistant,aqua-data-studio,Sql,Teradata,Teradata Sql Assistant,Aqua Data Studio,我一直在经历最艰难的时间将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(

我一直在经历最艰难的时间将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

“财政任期”存储桶在“销售”字段中使用“财政开始月份”,并将员工分组到存储桶中。 水桶: -0\u 3\u个月 -4个月6个月 -7个月12个月 -13个月24个月 -25个月以上 -不得而知


    ,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

干杯~
Arron

只要转换函数并结合两个似乎给出相同结果的情况,第一部分似乎可以

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

只要转换函数并结合两个似乎给出相同结果的情况,第一部分似乎就可以了

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

将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天:


将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天:


示例数据、期望的结果和对预期逻辑的解释将提高您获得帮助的机会。公平,更多内容时让我编辑。看起来您编辑了问题,但仍然没有示例数据和期望的结果。这将是非常有帮助的,因为它不清楚从代码单独的确切计算是什么。tsql非常复杂,介于解析、转换和数学之间。。我迷路了。你的问题到底是什么也不清楚。如果可以的话,试着简化一下。这里是我最好的猜测:我想得到员工的开始日期和今天之间的月数,其中月数由我们的会计期间确定,会计期间从每个月的21日开始,到下个月的20日结束。我相信类似这样的东西:选择COUNTPERIODDATE'2018-01-01',当前日期P_与fiscpers相交。选择PERIODcalendar_日期的会计期间,日历日期+间隔'1'个月作为Sys_calendar.calendar的会计期间,如果是这样的话,fiscpers将使您处于大致的状态。其中2018-01-01是员工开始样本数据、预期结果和预期逻辑的解释将提高您获得帮助的机会。公平,让我在更多内容时编辑。看起来您编辑了问题,但仍然没有样本数据和预期结果。这将是非常有帮助的,因为它不清楚从代码单独的确切计算是什么。tsql非常复杂,介于解析、转换和数学之间。。我迷路了。你的问题到底是什么也不清楚。如果可以的话,试着简化一下。这里是我最好的猜测:我想得到员工的开始日期和今天之间的月数,其中月数由我们的会计期间确定,会计期间从每个月的21日开始,到下个月的20日结束。我相信类似这样的东西:选择COUNTPERIODDATE'2018-01-01',当前日期P_与fiscpers相交。选择PERIODcalendar_日期的会计期间,日历日期+间隔'1'个月作为Sys_calendar.calendar的会计期间,如果是这样的话,fiscpers将使您处于大致的状态。其中2018-01-01是员工开始时,我收到了一个语法错误:对于顶级语法转换,预期介于和之间。有什么想法吗?放错括号了。原则上我会修改答案。但是dnoeth的更简单。我得到了一个语法错误:对于顶级语法转换,应该是介于和| |之间的东西。有什么想法吗?放错括号了。原则上我会修改答案。但德诺思的更简单。