在 SSMS 和 SSRS 中执行 SP 时日期表现不同

问题描述 投票:0回答:1

我有一个用于数据检索的 MS SQL Server 存储过程。

它由一个“父”存储过程组成,该存储过程具有月份和年份的输入参数。

我使用函数来获取“从”和“到”日期范围,然后将其直接传递到“子”存储过程以生成输出。

子存储过程具有 StartDate 和 EndDate 参数:

ALTER PROCEDURE
    [dbo].[usp_MasterExtractV3]
        (
            @StartDate DATE = NULL,
            @EndDate DATE = NULL
        )

当我运行存储过程并手动填充这些参数时

EXECUTE usp_MasterExtractV3 
    @StartDate = '2023-04-01',
    @EndDate = '2023-04-30'

在 SSMS 和 SSRS 报告中测试时,输出是正确的。

输出日期范围的表函数为变量年初日期范围生成以下数据(根据不从一月开始的年份输出日期范围)

Year    Month   MonthName   StartDate   EndDate
2024    3       March       2024-03-01  2024-03-31
2024    2       February    2024-02-01  2024-02-29
2024    1       January     2024-01-01  2024-01-31
2023    12      December    2023-12-01  2023-12-31
2023    11      November    2023-11-01  2023-11-30
2023    10      October     2023-10-01  2023-10-31
2023    9       September   2023-09-01  2023-09-30
2023    8       August      2023-08-01  2023-08-31
2023    7       July        2023-07-01  2023-07-31
2023    6       June        2023-06-01  2023-06-30
2023    5       May         2023-05-01  2023-05-31
2023    4       April       2023-04-01  2023-04-30

如果我使用这样的函数的输出:

SET @LocalStartDate = (SELECT Min(StartDate) FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
SET @LocalEndDate = (SELECT EndDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear) WHERE (Month = @localMonth))

我得到两个变量:

@LocalStartDate @LocalEndDate
2023-04-01      2023-04-30

如果我使用这些变量(而不是手动)调用存储过程,如下所示:

EXECUTE usp_MasterExtractV3 
    @StartDate = @LocalStartDate,
    @EndDate = @LocalEndDate

SSMS 中的输出完全符合我的预期。它从四月份的数据返回数千行。

如果我从 SSRS 运行相同的内容,它会产生一月到四月的输出。

SSMS 和 SSRS 之间解释这些开始和结束日期的方式有所不同。

我可以将参数从“计算”更改为“手动”,并查看输出方差的变化。我认为这一定与一个是字符串而另一个是 SQL DATE 数据类型有关,但我不知道如何纠正这个问题。

函数和输出存储过程都在另一个存储过程中运行,充当独立的报告数据检索容器。理论上,SSRS 日期格式不应该影响这一点,因为它是一个自包含的 SQL 存储过程,在 SSMS 和 SSRS 中产生不同的输出。

进一步调查确认,当作为 DATE 字段从 SQL Server 函数的输出传递到存储过程的输入的 @StartDate 和 @EndDate 参数发生更改时:

2023-04-01
2023-04-30

01/01/2023
04/30/2023

在 SSRS 中运行时,从 SSMS 运行时保持不变。

所以我拥有的是一个父存储过程,在 SSMS 和 SSRS 中运行时会产生不同的输出,我可以在其中使用字符串手动对日期值进行硬编码,并使其在两者中工作。

更新:

此 SQL 适用于 SSRS 和 SSMS

DECLARE @TestFrom Date = CAST('2023-04-01' AS DATE)
DECLARE @TestTo Date = CAST('2023-04-30' AS DATE)

EXECUTE usp_MasterExtractV3 
@StartDate = @TestFrom,
@EndDate = @TestTo

此 SQL 在 SSRS 中不起作用,但在 SSMS 中起作用

DECLARE @TestFrom Date = (SELECT CAST(Min(StartDate) AS DATE) AS StartDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
DECLARE @TestTo Date = (SELECT CAST(EndDate AS DATE) AS EndDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear) WHERE (Month = @localMonth))

EXECUTE usp_MasterExtractV3 
@StartDate = @TestFrom,
@EndDate = @TestTo

语句返回的值:

(SELECT CAST(Min(StartDate) AS DATE) AS StartDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))

2023-04-01

语句返回的值:

(SELECT CAST(EndDate AS DATE) AS EndDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear) WHERE (Month = @localMonth))

2023-04-30
sql-server reporting-services
1个回答
0
投票

这是我想到的一件事,可能会有所作为:

更改此代码:

(SELECT CAST(Min(StartDate) AS DATE) AS StartDate 
FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))

代码:

(SELECT Min(CAST(StartDate AS DATE)) AS StartDate 
FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
© www.soinside.com 2019 - 2024. All rights reserved.