【问题标题】:SQL to separate YYYY MM to fiscal yearSQL 将 YYYY MM 与会计年度分开
【发布时间】:2016-05-04 06:42:12
【问题描述】:

我有一个列说明月份和年份YYYY MM。我将它们分成两列(YearMonth)。问题是,年份是日历年,而理想情况下我需要我使用的财政年度(Apr 01Mar 31 - 这永远不会改变)。

我见过的其他解决方案是基于日期格式的,而我原来的列是字符串。

我需要一个语句来返回我的新年列的财政年度而不是日历年。

我目前的说法是:

Select Month,
parsename(replace(Month,' ','.'),1) as MonthM,
parsename(replace(Month,' ','.'),2) as Year
FROM TblTrade

用于分隔列。

所以预期的结果将是例如: 2 月 15 日变为 2 月和 2015 年。 4 月 15 日变为 4 月和 2016 年。

请指教。

【问题讨论】:

标签: sql sql-server sql-server-2012 tableau-api


【解决方案1】:

Sql 服务器:

declare @date datetime = getdate();
select 
(YEAR(DATEADD(Month,-((DATEPART(Month,@date)+5) %12),@date))) AS Financial_Year

假设四月是第 1 个月

【讨论】:

    【解决方案2】:

    试试这个

        select case 
                 when to_char(to_date(column_name,'yyyy mm'),'mm') between 01 and 03 
                      then to_char(trunc(to_date(column_name,'yyyy mm')),'yyyy')-1
                 else to_number(to_char(trunc(to_date(column_name,'yyyy mm')),'yyyy')) end 
        fiscal_year
        from table_name
    

    我正在使用 oracle 数据库 这将在列是字符串并且具有有效数据时起作用,即日期格式为yyyy mm

    【讨论】:

      【解决方案3】:

      既然您已经阅读了其他文章(您确实应该在问题中提及您所做的研究)并且您仍然遇到问题,所以我为您准备了一个剧本。

      如果我理解正确,你有一个带有 YYYY MM 的 varchar,例如

      2015 01
      2015 02
      2015 03
      2015 04
      

      等你想要的

      Jan 2014
      Feb 2014
      Mar 2014
      Apr 2015
      

      来了……

      设置一些测试数据

          DROP TABLE IF EXISTS #Test;
      
          WITH Dates AS (
              SELECT CAST(GETDATE() AS DATE) AS Date
              UNION ALL
              SELECT DATEADD(MONTH, -1, Date) FROM Dates
              WHERE Date > '20140101'
          )
          SELECT DISTINCT
              CONVERT(VARCHAR(4), YEAR(Date)) + ' ' +RIGHT(CONVERT(VARCHAR(6), Date, 112), 2) YearMonth
          INTO #Test 
           FROM Dates
          OPTION (MAXRECURSION 0);
      
          SELECT * FROM #Test
      
      YearMonth
      ---------
      2013 12
      2014 01
      2014 02
      2014 03
      2014 04
      2014 05
      etc
      

      查找会计年度

          SELECT 
              LEFT(YEARMONTH, 4) Year
              ,RIGHT(YEARMONTH, 2) Month
              ,LEFT(DATENAME(MONTH , DateAdd( month , CONVERT(INT,RIGHT(YEARMONTH, 2)) , -1 )), 3) MonthName
              ,IIF(CONVERT(INT, RIGHT(YEARMONTH, 2)) >= 4, CONVERT(INT,LEFT(YEARMONTH, 4)), CONVERT(INT,LEFT(YEARMONTH, 4)-1 )) FiscalYear
          FROM #TEST
      
          Year Month MonthName FiscalYear
          ---- ----- --------- -----------
          2013 12    Dec       2013
          2014 01    Jan       2013
          2014 02    Feb       2013
          2014 03    Mar       2013
          2014 04    Apr       2014
          2014 05    May       2014
          2014 06    Jun       2014
          etc
      

      您可以将年/月解析放在子查询中,以使代码更清晰,并且一些讨厌的格式可以替换为 FORMAT,因为您在 2012 年。

      希望这是您所追求的并有所帮助。

      【讨论】:

        【解决方案4】:

        由于您包含了 Tableau 标记,我将描述 Tableau 方法——这与其他答案略有不同,因为您倾向于指定您想要 Tableau 的内容,并让其驱动程序为您的数据库生成必要的 SQL .

        首先,如果您有一个数据类型为 DATE 的字段而不是月份和年份的单独字段,则效果最好。

        然后,您可以将日期汇总到最近的年、月、日等(实际上是截断到期间的开始),或者根据需要提取日期的特定部分年、月、日等进行分组/显示。

        使用真正的 DATE 数据类型的另一个好处是,您可以告诉 Tableau 每个数据源的会计年度开始时间,并且它会对日期进行适当的排序。只需右键单击数据源并设置日期属性。您还可以设置星期的开始和日期格式。

        【讨论】:

          猜你喜欢
          • 2016-06-26
          • 2020-02-24
          • 2017-05-29
          • 2019-01-28
          • 1970-01-01
          • 2016-06-04
          • 2018-01-08
          • 2020-06-22
          • 1970-01-01
          相关资源
          最近更新 更多