1

我正在构建一个具有标题字段的报告PropertyStatementForHalfyear Ending :<Date>

因此,在该DATE字段中,我需要输入May 28Nov 28根据报告运行的日期

我需要写什么逻辑?

  • 例如,如果我今天运行报告,即 6 月 22 日,我需要显示 PropertyStatementForHalfyear Ending : 28 Nov 2013
  • 如果我在 2013 年 12 月运行它,我需要显示PropertyStatementForHalfyear Ending : 28 May 2014
4

2 回答 2

1

你可以使用这样的东西:

DECLARE @DateThreshold1 DATE = '20130528'
DECLARE @DateThreshold2 DATE = '20131128'

DECLARE @CurrentDate DATE = '20131201'

IF @CurrentDate > @DateThreshold2
    SELECT CONVERT(VARCHAR(50), DATEADD(YEAR, 1, @DateThreshold1), 106)
ELSE IF @CurrentDate > @DateThreshold1
    SELECT CONVERT(VARCHAR(50), @DateThreshold2, 106)
ELSE
    SELECT CONVERT(VARCHAR(50), @DateThreshold1, 106)
  • 对于从20130101到的日期20130528,这将返回28 May 2013
  • 对于从20130529到的日期20131128,这将返回28 Nov 2013
  • 对于过去的日期20131128,这将返回28 May 2014

您可以轻松地将其打包成一个函数或 SSRS 代码片段

于 2013-06-22T09:14:06.737 回答
1

如果你不喜欢 IF/CASE 语句,像我一样:

with dt as 
(select CAST('2013-11-28' as datetime) dt) --dt becomes your datetime column.
, ymdt as (select 
    DATEPART(year, dt) y,
    DATEPART(month, dt) m,
    DATEPART(day, dt) d,
    dt
    from dt) --split into year, month and date for readability
select y, m, d, dt,
    DATEADD(month, 5 + d/28 - (m + d/28) % 6, --add months depending on month and day
    DATEADD(day, 28 - d --go to the correct day
    , dt) --start calculation from dt (the sql date functions' parameter order has always baffled me)
    ) HalfYearEndDate 
from ymdt

SQL 引擎将所有这些合并到一个大的常量扫描或日期时间列上的标量表达式中。

如果您在其他报告中需要此功能,您应该为此创建一个 SQL 或 VB 函数,这样它就不会弄乱您的查询。

另外:除非绝对必要,否则不要在 T-SQL 中进行文本格式化!返回一个日期时间列并在报告本身中执行此操作。您需要在文本框上设置的格式是“dd MMM yyyy”(使用设计器时不带引号)。

于 2013-06-22T23:31:04.057 回答