SQL Case语句复制excel公式

SQL Case语句复制excel公式,sql,sql-server,excel,sql-server-2008,excel-formula,Sql,Sql Server,Excel,Sql Server 2008,Excel Formula,我有一份excel报告,我正试图使用存储过程将其转换为SSRS报告。在非本人编写的现有excel中,有一个公式如下 =IF( [Date TCY Vacated]="",0,IF([Date TCY Tenanted]="",Summary!$B$3 - ( [Date TCY Vacated]+1), IF( ( [Date TCY Tenanted] -1)- ( [Date TCY Vacated] +1) <0,0, ( [Date TCY Tenanted] -1)- ( [D

我有一份excel报告,我正试图使用存储过程将其转换为SSRS报告。在非本人编写的现有excel中,有一个公式如下

=IF( [Date TCY Vacated]="",0,IF([Date TCY Tenanted]="",Summary!$B$3 - ( [Date TCY Vacated]+1), IF( ( [Date TCY Tenanted] -1)- ( [Date TCY Vacated] +1) <0,0,  ( [Date TCY Tenanted] -1)- ( [Date TCY Vacated] +1)   )   ))
我试图将其转换为sql case语句

我希望这是一个整数,这样我就可以把这个列加起来,得到总的空置天数

Case When [Date TCY Vacated] Is Null Then '0' 
                    else case when [Date TCY Tenanted] = '' then @End - ([Date TCY Vacated]+1)
                    else case when ([Date TCY Tenanted] - 1) - ([Date TCY Vacated] +1) < 0 then 0
                    else  Convert(Varchar(30),[Date TCY Tenanted],120) - Convert(Varchar(30),[Date TCY Vacated],120) end end end as 'Void Days'

尝试过但不起作用,我正在尝试添加示例数据,但不确定如何添加。所有字段都是日期字段,预期结果为2018-02-14-2018-02-12=2天。

不是案例陈述,而是Excel函数的SQL版本。它应该在SSRS中工作

Declare @tcyv Int = 1
Declare @tcyt Int = ''
Declare @summ Int = 300

Select iif(@tcyv = '', 0,
            iif(@tcyt = '', @summ - (@tcyv+1),
            iif(((@tcyt-1) - (@tcyv+1)) < 0, 0,
                 (@tcyt-1) - (@tcyv+1)))) As x

我认为你遇到问题的原因是你在使用标准的数学运算符处理日期

下面的示例基于您提供的示例,并对使用日期函数进行了一些调整。它可能不能完美地反映您期望的结果,但希望它能让您在实现这一目标的过程中走得更远:

CREATE TABLE #a ([Date TCY Vacated] DATE, [Date TCY Tenanted] DATE)

INSERT INTO #a ([Date TCY Vacated], [Date TCY Tenanted])
    VALUES ('2018-02-10', '2018-02-08')
            ,(NULL, '2018-02-08')
            ,('2018-02-10', NULL)
            ,('2018-02-10', '2018-02-28')


DECLARE @End DATE = GETDATE()

SELECT *,
        CASE WHEN [Date TCY Vacated] IS NULL
            THEN    0
            ELSE    CASE WHEN [Date TCY Tenanted] IS NULL 
                        THEN    DATEDIFF(d, @End, DATEADD(d, 1, [Date TCY Vacated]))
                        ELSE    CASE WHEN DATEADD(d, -1, [Date TCY Tenanted]) < DATEADD(d, 1, [Date TCY Vacated])
                                    THEN    0
                                    ELSE    DATEDIFF(d, DATEADD(d, -1, [Date TCY Tenanted]), DATEADD(d, 1, [Date TCY Vacated]))
                                END
                    END
        END
FROM #a

特别是,此代码使用DATEADD和DATEDIFF而不是“+”和“-”,以确保所有操作在几天内完成。

示例数据和所需结果比Excel公式更有用。数据是什么样子的?您的case表达式是什么样子的?因为这看起来很直截了当。。。e、 g.【TCY腾空日期】=然后0时【TCY租赁日期】=然后。。。艾奇·戈登,我不擅长发问。。不确定如何给出示例数据,实际上列都是日期字段,无效开始日期可出租日期报价日期接受日期出租日期无效开始日期计算无效结束日期计算日期TCY腾空日期TCY承租日期TCY 2017年12月13日2017年12月27日无效无效2017年12月13日2017年12月13日2017年12月13日2018年4月20日无效2018年3月3日无效2018年3月20日2018年3月21日2018年3月19日2018年3月19日无效ZLK更新问题,当前不起作用代码我不清楚你是如何处理你的约会对象的,但希望这能帮助你前进。
298
CREATE TABLE #a ([Date TCY Vacated] DATE, [Date TCY Tenanted] DATE)

INSERT INTO #a ([Date TCY Vacated], [Date TCY Tenanted])
    VALUES ('2018-02-10', '2018-02-08')
            ,(NULL, '2018-02-08')
            ,('2018-02-10', NULL)
            ,('2018-02-10', '2018-02-28')


DECLARE @End DATE = GETDATE()

SELECT *,
        CASE WHEN [Date TCY Vacated] IS NULL
            THEN    0
            ELSE    CASE WHEN [Date TCY Tenanted] IS NULL 
                        THEN    DATEDIFF(d, @End, DATEADD(d, 1, [Date TCY Vacated]))
                        ELSE    CASE WHEN DATEADD(d, -1, [Date TCY Tenanted]) < DATEADD(d, 1, [Date TCY Vacated])
                                    THEN    0
                                    ELSE    DATEDIFF(d, DATEADD(d, -1, [Date TCY Tenanted]), DATEADD(d, 1, [Date TCY Vacated]))
                                END
                    END
        END
FROM #a