Sql server 根据输入的SQL Server和SSRS计算财政年度开始和结束日期

Sql server 根据输入的SQL Server和SSRS计算财政年度开始和结束日期,sql-server,sql-server-2008,sql-server-2005,ssrs-2008,Sql Server,Sql Server 2008,Sql Server 2005,Ssrs 2008,我有一份报告,它把年份作为一个参数,我想计算财政年度的开始和结束。以下是我的尝试: CREATE PROCEDURE [dbo].[sp_name] @StartDate as datetime, @Enddate as datetime, @year as varchar(10) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering w

我有一份报告,它把年份作为一个参数,我想计算财政年度的开始和结束。以下是我的尝试:

CREATE PROCEDURE [dbo].[sp_name] 
     @StartDate as datetime,
     @Enddate as datetime,
     @year as varchar(10)
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON; 

    @StartDate = year(dateadd(q, -1, cast(cast(@year AS char) + '/01/' + cast(@year AS char) AS datetime))) = @year
这是正确的方法吗

我需要财务开始日期为2014年7月1日至2015年6月30日,如果输入的年份为2015年。请注意,我需要在内部用脚本计算。如果我做错了什么,我如何纠正这一点以获得期望的结果?

使用DATEADD和DATEDIFF,您可以在您的会计年度使用计算机:

DECLARE @year INT = 2015

SELECT
    start_date = DATEADD(MONTH, 6, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, @year - 1900, 0)) - 1, 0)),
    end_date = DATEADD(DAY, -1, DATEADD(MONTH, 6, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, @year - 1900, 0)), 0)))
阅读更多常见的日期例程

要在存储过程中使用它,请执行以下操作:

CREATE PROCEDURE procedure_name
    @year AS INT
AS
BEGIN
SET NOCOUNT ON

SELECT
    start_date = DATEADD(MONTH, 6, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, @year - 1900, 0)) - 1, 0)),
    end_date = DATEADD(DAY, -1, DATEADD(MONTH, 6, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, @year - 1900, 0)), 0)))

END

对于SQL server 2012+版本,可以使用DATEFROMPARTS


也许这会有所帮助,在财政年度发生变化或你搬到一家新公司时也会起作用

CREATE PROCEDURE [dbo].[usp_yeardates] /* or your sp name */
    @year AS SMALLINT,
    @monthoffset AS TINYINT = 0, /* if you wish your year to start at a month other than jan then set number of months to offset, e.g. to start April, move three forward @monthoffset = 3 */
    @startdate AS SMALLDATETIME OUTPUT, /* NB 2008r2+ use DATE instead of SMALLDATETIME */
    @enddate AS SMALLDATETIME OUTPUT
AS

/* Created by Darren Edward Comeau - 26/08/2015 */

BEGIN

    /* check inputs */
    IF @year < 1900 or @year > 2078
        RAISERROR ('year out of bounds',16,1)

    ELSE IF @monthoffset > 11
        RAISERROR ('monthoffset out of bounds',16,2)

    ELSE
        SELECT
            /* logic to establish start / end date */
            @startdate =
                dateadd(month,@monthoffset,
                    dateadd(year,@year-1900,'19000101')
                ),
            @enddate =
                dateadd(day,-1,
                    dateadd(month,@monthoffset,
                        dateadd(year,@year-1899,'19000101')
                    )
                );

END;
GO
这将为您提供财政年度的开始和结束日期


下面的代码在Azure SQL DB和内部部署中都适用。根据你的需要/愿望改变你的时区。单元测试

如果我们给出了当前日期或我们希望给出的任何日期,下面的代码将帮助我们给出作为结果集的财政年度开始和结束日期

还想提到的是,财政年度的逻辑不适用于单独的年度。请检查以下两种情况。 2019年->可能是3月31日或4月1日。如果我们不指定日期,我们将以错误告终。 日期- 20190331->财务开始日期为20180401,财务结束日期为20190331。 20190401->财务开始日期为20190401,财务结束日期为20200331

DECLARE @Current_DateTime DATETIME= SYSDATETIMEOFFSET() AT TIME ZONE 'India Standard Time'; -- GETDATE()
--  SET @Current_DateTime='20200312'; -- uncomment this line to test with your desired date.

SELECT DATEFROMPARTS(Yr, 4, 1) AS FinancialYear_StartDate,
DATEFROMPARTS(Yr + 1, 3, 31) AS FinancialYear_EndDate,
CONCAT(Yr,'-',Yr+1) AS FinancialYear
FROM
(SELECT CASE WHEN DATEPART(MONTH, @Current_DateTime ) < 4 
THEN DATEPART(YEAR, @Current_DateTime ) - 1 ELSE DATEPART(YEAR, @Current_DateTime ) END Yr) a;

这将提供印度财政年度的起始日期。i、 g.四月至三月

SELECT CAST(DATEFROMPARTS(YEAR(DATEADD(M, (MONTH(DATEADD(MONTH, -4, GETDATE()) - 1) * -1), GETDATE())), MONTH('04-01-2020'), DAY('04-01-2020')) AS date)

旁注:存储过程不应使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!另外:@year实际上始终是一个数值-那么为什么要将该参数声明为varchar10??使用最合适的数据类型-INT在这里更有意义!非常感谢。我将在实际实现过程中纠正所有这些问题。我使用的是SQL 2008。这给出了截至2014年7月1日12:00和2015年6月30日12:00的结果。使用此参数运行的报表返回的记录较少。然而,使用“2014年7月1日”和“2015年6月30日”运行的报告返回了更多的记录,我认为这是正确的。那么,如何将开始和结束日期设置为“2014年7月1日”和“2015年6月30日”?我使用的是Sql server 2008。需要一个在2008版本中有效的解决方案。您的日期约束问题可能与当月的最后一天有关,如果包含日期部分,则排除全天记录。有两种方法可以解决这个问题,使用从最后一天算起的第二天,并使用小于<运算符;或者,从日期字段中删除时间组件,其中castconvertchar8、[mydatefield],112作为startdate和enddate之间的日期时间。第一种方法在很多情况下都会表现得更好。您想对您的纯代码答案添加一些解释吗?这将有助于消除StackOverflow是免费编程服务的误解。感谢@Yunnosch提供宝贵的反馈。补充了一些解释。
DECLARE  @DateFrom datetime, @DateTo   datetime
SET @DateFrom = '2012-03-30'
SET @DateTo = '2021-03-31'

DECLARE @Output TABLE ( Item NVARCHAR(1000),startdate Datetime,enddate Datetime )
DECLARE @Year INT
DECLARE @EndYear INT
DECLARE @Month INT
DECLARE @FinacialYearValue INT

SET @Month = CAST(MONTH(@DateFrom) AS INT)
SET @Year = CAST(YEAR(@DateFrom) AS INT)
SET @EndYear= CAST(YEAR(@DateTo) AS INT)
SET @FinacialYearValue = (CASE WHEN @Month <=3 THEN @Year - 1 ELSE @Year END)

WHILE @EndYear >= @FinacialYearValue
BEGIN
    INSERT INTO @Output (Item,startdate,enddate )
       SELECT CAST(@FinacialYearValue AS varchar(4))  + '-' + CAST((@FinacialYearValue +1 )  AS varchar(4)) ,
       start_date = DATEADD(MONTH, 3, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, @FinacialYearValue+1 - 1900, 0)) - 1, 0)),
       end_date = DATEADD(DAY, -1, DATEADD(MONTH, 3, DATEADD(YEAR, DATEDIFF(YEAR, 0, DATEADD(YEAR, @FinacialYearValue+1 - 1900, 0)), 0)))

    SET @FinacialYearValue += 1
END

SELECT * FROM @Output
Declare @BillDate smalldatetime, @FYStartDate smalldatetime, @FYEndDate smalldatetime
Select @BillDate ='10-JAN-2019'

Select @FYStartDate = case when MONTH(@BillDate) <=3 Then '01-Apr-' + CAST(YEAR(@BillDate) - 1 AS varchar(4)) Else '01-Apr-' + CAST(YEAR(@BillDate)  AS varchar(4)) End,
@FYEndDate = case when MONTH(@BillDate) <=3 Then '31-Mar-' + CAST(YEAR(@BillDate)  AS varchar(4)) Else '31-Mar-' + CAST(YEAR(@BillDate) + 1  AS varchar(4)) End
DECLARE @Current_DateTime DATETIME= SYSDATETIMEOFFSET() AT TIME ZONE 'India Standard Time'; -- GETDATE()
--  SET @Current_DateTime='20200312'; -- uncomment this line to test with your desired date.

SELECT DATEFROMPARTS(Yr, 4, 1) AS FinancialYear_StartDate,
DATEFROMPARTS(Yr + 1, 3, 31) AS FinancialYear_EndDate,
CONCAT(Yr,'-',Yr+1) AS FinancialYear
FROM
(SELECT CASE WHEN DATEPART(MONTH, @Current_DateTime ) < 4 
THEN DATEPART(YEAR, @Current_DateTime ) - 1 ELSE DATEPART(YEAR, @Current_DateTime ) END Yr) a;
CREATE PROC udp_financial_year
AS
BEGIN
SELECT DISTINCT
CASE 
WHEN DATEPART(MONTH,creationdate) <10 then 
CONVERT(VARCHAR,DATEPART(YEAR,creationdate)-1)+'-'+
CONVERT(VARCHAR,DATEPART(YEAR,creationdate)) 
ELSE 
CONVERT(VARCHAR,DATEPART(YEAR,creationdate))+'-'+ 
CONVERT(VARCHAR,DATEPART(YEAR,creationdate)+1)
END 
financialyr
FROM testing
ORDER BY financialyrDESC
END
SELECT CAST(DATEFROMPARTS(YEAR(DATEADD(M, (MONTH(DATEADD(MONTH, -4, GETDATE()) - 1) * -1), GETDATE())), MONTH('04-01-2020'), DAY('04-01-2020')) AS date)
Declare @Date date = Getdate() ---Paste your date here

Declare @Fyear  varchar(4)

Declare @FyearStartDate Date

Declare @FyearEnd varchar(4)

Declare @FyearEndDate Date

If Month(@Date) >= 4 
Set @Fyear             = year(@Date)
Else
Set  @Fyear             = year(@Date)-1

Set @FyearStartDate  =  '04' +'-'+ '01-' + @Fyear

Set @FyearEnd             = @Fyear+1

Set @FyearEndDate    =  '03' +'-'+ '31-' + @FyearEnd

Select @FyearStartDate FYSTARTDT, @FyearEndDate FYENDDT