【问题标题】:TSQL Including fiscal year in select statement based on the dateTSQL 在基于日期的选择语句中包括会计年度
【发布时间】:2017-05-14 23:47:02
【问题描述】:

我需要根据今天的日期在我的选择语句中包含财政年度,例如 2016 年 12 月 30 日 2016-2017。财政年度从 7 月 1 日开始。截至 2017 年 7 月 1 日,它应该计算 2017-2018。我怎样才能做到这一点?

ClaimNo
20161030
20161124
20160815
20170115
20180101

SELECT * 
FROM TABLE
WHERE ClaimNo LIKE '2016%' OR ClaimNo LIKE '2017%';

【问题讨论】:

  • 是否要在SELECT 中包含会计年度,即创建另一个包含会计年度的列,或者限制会计年度返回的行,例如WHERE FiscalYear( ClaimNo ) = 1066?提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

标签: sql-server tsql ssms


【解决方案1】:
DECLARE @ThisYear VARCHAR(50)
DECLARE @NextYear VARCHAR(50)
SET @ThisYear = CAST(DATEPART(YYYY,GETDATE()) as varchar(20)) +'0731'  --print @ThisYear
SET @NextYear = CAST(DATEPART(YYYY,DATEADD(YYYY,1,GETDATE()))as varchar(20))+'1231' --print @Nextyear


SELECT * FROM TABLE WHERE CAST(ClaimNo AS DATE) BETWEEN @ThisYear and @NextYear

【讨论】:

    【解决方案2】:
    SELECT ClaimNo,
        CASE WHEN MONTH(CONVERT(DATE,ClaimNo)) <7 THEN YEAR(CONVERT(DATE,ClaimNo))
            ELSE YEAR(CONVERT(DATE,ClaimNo)) + 1 END AS FiscalYear
    FROM
        <<Table>>;
    

    测试代码

    DECLARE @tab TABLE (ClaimNo CHAR(20));
    
    INSERT INTO @tab (ClaimNo)
    VALUES
    ('20161030'),
    ('20161124'),
    ('20160815'),
    ('20170115'),
    ('20180101');
    
    SELECT ClaimNo,
        CASE WHEN MONTH(CONVERT(DATE,ClaimNo)) <7 THEN YEAR(CONVERT(DATE,ClaimNo))
            ELSE YEAR(CONVERT(DATE,ClaimNo)) + 1 END AS FiscalYear
    FROM
        @tab;
    

    【讨论】:

      【解决方案3】:

      借助临时统计表,我们可以轻松计算会计年度。在这种情况下,我们从 1980 年开始,接下来的 50 年。这两个项目都可以根据需要进行调整。

      DECLARE @table TABLE (ClaimNo varchar(25));
      INSERT INTO @table (ClaimNo)
      VALUES
      ('20161030'),
      ('20161124'),
      ('20160815'),
      ('20170115'),
      ('20180101');
      
      
      Select A.ClaimNo
            ,FiscalYear = Str(Year(D1),4)+' - '+Str(Year(D2),4)
       From  @table A
       Join (
              Select Top 50 D1=cast(DateAdd(YY,Row_Number() Over (Order By Number)-1,'1980-07-01') as Date) 
                           ,D2=cast(DateAdd(YY,Row_Number() Over (Order By Number),'1980-06-30') as Date) 
               From master..spt_values 
            ) D
          on ClaimNo Between D1 and D2
      

      返回

      ClaimNo     FiscalYear
      20161030    2016 - 2017
      20161124    2016 - 2017
      20160815    2016 - 2017
      20170115    2016 - 2017
      20180101    2017 - 2018
      

      注意:如果 ClaimNo 是 int,只需将 ON 子句改为

      on cast(ClaimNo as varchar(8)) Between D1 and D2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 2019-03-15
        相关资源
        最近更新 更多