在
Crystal
中,我试图根据他们是否在指定日期范围内居住在住房中来选择一个人(并进一步将他们纳入计数,但我已处理该部分)。
所以基本上
Bob
住在从1/1/2020
(搬入)到5/30/2021
(搬出)的一个单元中,我试图找到从1/1/2021
(开始日期)到3/1/2022
(开始日期)期间住在该设施的所有租户结束日期)。如果租户仍住在那里,他们的 moveout
将会是 NULL
。
我已经尝试过将其作为范围评估、日期范围参数、SQL case 语句、各种公式,但它只是无法正确提取数字。以下是我目前的尝试。我包含了一个 SQL 标签,因为使用 Case When 语句可能有更简单的方法来做到这一点。
尝试:
Formula
if ({View_Tenants.movein} <= {?Start Date} and
{@MoveoutNull} >= {?Start Date})
or
({View_Tenants.movein} <= {?End Date} and
{@MoveoutNull} >= {?End Date})
or
({View_Tenants.movein} >= {?Start Date} and
{@MoveoutNull} <= {?Start Date})
then 1 else 0
Select Statement
RangeAnalysis = 1
MoveoutNull:
if isnull({View_Tenants.moveout}) then currentdate
(我也尝试过这个作为未来的一种方式)。
我们必须弄清楚在我们感兴趣的时间内是否有任何租户在该设施周围闲逛。让我们对此进行分析:
我们基本上是在指定的时间范围内检查任何时候在设施内的任何人。
鉴于这些情况,您的情况将变为:
{View_Tenants.movein} <= {?Start Date} and {@MoveoutNull} >= {?End Date}
{View_Tenants.movein} <= {?Start Date} and {@MoveoutNull} between {?Start Date} and {?End Date}
{View_Tenants.movein} between {?Start Date} and {?End Date}
如果结合场景,公式会是什么样子的示例。
脚本:
if
({View_Tenants.movein} <= {?Start Date} and {@MoveoutNull} >= {?End Date}) or
({View_Tenants.movein} <= {?Start Date} and {@MoveoutNull} between {?Start Date} and {?End Date}) or
({View_Tenants.movein} between {?Start Date} and {?End Date})
then
1
else
0
您的
MoveoutNull
公式已正确设置,可将空的迁出日期替换为当前日期。
最终声明:
RangeAnalysis = 1
请记住,在此过程中,在给定时间范围内居住在该设施的个人被标记为“1”,而未居住在该设施的个人则被标记为“0”。最终计数只是将所有“1”相加。
让我们用简单的英语来分解逻辑:
MoveoutNull: if isnull({View_Tenants.moveout}) then currentdate
所以
MoveoutNull
表示搬出日期或今天的日期。
1 if ({View_Tenants.movein} <= {?Start Date} and {@MoveoutNull} >= {?Start Date}) or
2 ({View_Tenants.movein} <= {?End Date} and {@MoveoutNull} >= {?End Date}) or
3 ({View_Tenants.movein} >= {?Start Date} and {@MoveoutNull} <= {?Start Date})
4 then 1 else 0
入住日期小于或等于开始日期,搬出日期或今天大于或等于开始日期。 退房
入住日期小于或等于结束日期,并且迁出日期或今天大于或等于结束日期。 退房
入住日期大于或等于开始日期,搬出日期或今天小于或等于开始日期。 这种情况在逻辑上似乎不太可能,因为我们正在检查是否有人在特定日期之后搬入,然后在同一日期之前搬出。
我认为你只需要将第 3 行中的
{@MoveoutNull} <= {?Start Date})
更改为 {@MoveoutNull} <= {?End Date})
。