【问题标题】:Get financial year start date and end date based on alias in sql server 2005根据sql server 2005中的别名获取财政年度开始日期和结束日期
【发布时间】:2015-03-07 20:26:36
【问题描述】:

我的表格包含两列,一列用于月份,另一列用于年份。基于这两列,我想要该财政年度的所有记录。例如。如果月份是 10,年份是 2014,那么其财政年度将是 FY 01StApr14 - 31stMar15。

我如何编写 SQL 选择查询来获取在 FY 01stApr14-31stMar15 之间创建的所有记录,这些记录基于月份和年份在该表中可用。

M 尝试以下查询,但收到错误消息为“关键字“和”附近的语法不正确。”

with cte as
(
select id,iono,iomonth,ioyear,
        convert(datetime,'01/'+right('00' + convert(varchar(10),iomonth,2),2) 
        + '/' +convert(varchar(4),IOyear),103) as FinDate from iodetails where iono=12345
)
select month(findate),* from cte where iono=12345 and
findate between 
case 
when month(findate)>=4 
then  convert(datetime,'01/'+'04'+ '/' +convert(varchar(4),IOyear),103) and 
        convert(datetime,'31/'+ '03' + '/' +convert(varchar(4),IOyear+1),103)
        else
 convert(datetime,'01/'+'04'+ '/' +convert(varchar(4),IOyear),103)  and 
    convert(datetime,'31/'+ '03' + '/' +convert(varchar(4),IOyear),103)
            end

【问题讨论】:

    标签: sql sql-server date select


    【解决方案1】:

    试试这个:

    SELECT * 
    FROM tableA 
    WHERE CAST((CAST(YearCol AS VARCHAR(10)) + (CAST(MonthCol AS VARCHAR(10))) AS INT) 
          BETWEEN CAST((CASE WHEN @V_Month BETWEEN 4 AND 12 THEN CAST((CAST(@V_Year AS VARCHAR(10)) + '04') AS INT) 
                             WHEN @V_Month BETWEEN 1 AND 3 THEN CAST((CAST(@V_Year - 1 AS VARCHAR(10)) + '04') AS INT) 
                             ELSE '' 
                         END
                       ) AS INT)
            AND CAST((CASE WHEN @V_Month BETWEEN 4 AND 12 THEN CAST((CAST(@V_Year + 1 AS VARCHAR(10)) + '03') AS INT) 
                           WHEN @V_Month BETWEEN 1 AND 3 THEN CAST((CAST(@V_Year AS VARCHAR(10)) + '03') AS INT) 
                           ELSE '' 
                      END
                     ) AS INT);
    

    【讨论】:

      【解决方案2】:

      如果我正确理解您的要求,您可以试试这个:

      SELECT * FROM mytable
       WHERE year(dateadd(q, -1, mydate)) = 2014
      

      这将从mydate 的值中减去1 个季度(3 个月)并提取年份。所以31 Mar 2015减法后变为31 Dec 2014,提取年份为2014年。

      糟糕抱歉,我看到您有两列,月份和年份。在这种情况下,你可以试试这个:

      SELECT * FROM mytable
        WHERE year(dateadd(q, -1, cast(cast(mymonth AS char) + '/01/' + cast(myyear AS char) AS datetime))) = 2014
      

      然而,这可能不是最有效的方法。

      根据我的 cmets 更新

      以下是在表上创建计算列的方法:

      ALTER TABLE mytable
        ADD mydate AS cast(cast(mymonth AS char) + '/01/' + cast(myyear AS char) AS datetime)
      

      【讨论】:

      • 我的表格中没有日期字段。只有月、年和一些附加字段。我试图连接并获取日期作为别名,但我如何在别名上写条件并获取结果财政年度的所有记录。
      • 如果你做一个子查询,你可以在别名上写条件。但也许更好的选择是创建一个计算列,根据月份和年份计算日期?
      • 现在我尝试使用 CTE 作为别名条件,因为我们无法更改表。问题中提到的代码。但出现错误'关键字'between'附近的语法不正确。'
      • 收到错误消息为''关键字'and'附近的语法不正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      相关资源
      最近更新 更多