我正在尝试计算SSRS报告中的动态任期字段。如果雇员的工作时间不到一个月,则以天为单位显示任期,如果雇用不到一年,则以月为单位显示任期,最后以年为单位显示任期。我有一名员工于2016年10月31日被聘用,目前的任期为2年。我的表达如下。任何人都可以在这个问题上指出我的缺陷吗?它看起来对我来说。
=IIF(DateDiff(DateInterval.Month,Fields!ASSC_HIRE_DATE.Value,Now())<1,
DateDiff(DateInterval.Day,Fields!ASSC_HIRE_DATE.Value,Now()) & " Days",
IIF(DateDiff(DateInterval.Year,Fields!ASSC_HIRE_DATE.Value,Now())<1,
DateDiff(DateInterval.Month,Fields!ASSC_HIRE_DATE.Value,Now()) & " Months",
DateDiff(DateInterval.Year,Fields!ASSC_HIRE_DATE.Value,Now()) & " Years"))
答案 0 :(得分:2)
DateDiff
并不能完全按照您的想法行事。正如您所发现的,DateDiff(DateInterval.Year,Fields!ASSC_HIRE_DATE.Value,Now())
正在评估为2,因为它将2018年与2016年的雇用日期进行比较。您可以将Now()
替换为日期12/31/2017和1/1 /来检查这一点。 2018年 - 前者将返回1,后者将返回2.这在您IIf
的第一部分中用于检查月份的情况类似:当它实际上只有15个月和几天时评估为16 。从本质上讲,DateDiff
将小数结果舍入到下一个int。
您解决此问题的方式最终取决于您的要求:您可以将月份定义为30天,将一年定义为365天吗?或者重要的是要考虑几个月有更多/更少的日子,有些年份是闰年?
如果您可以假设30天和365天,那么您可以使用以下内容(同样,我建议使用Switch
,因为您有超过2种可能的结果 - 更清洁,更容易阅读我的意见)
=Switch(
DateDiff(DateInterval.Day,Fields!ASSC_HIRE_DATE.Value,Now()) < 30, DateDiff(DateInterval.Day,Fields!ASSC_HIRE_DATE.Value,Now()) & " Days",
DateDiff(DateInterval.Day,Fields!ASSC_HIRE_DATE.Value,Now()) < 365, DateDiff(DateInterval.Day,Fields!ASSC_HIRE_DATE.Value,Now()) / 30 & " Months",
true, DateDiff(DateInterval.Day,Fields!ASSC_HIRE_DATE.Value,Now()) / 365 & " Years"
)
如果您还希望进行此轮次调整(例如,雇用日期为2016年10月31日的人在2017年10月31日之前不会显示为2年的任期,而不是允许格式化格式要将整个Switch
语句包装在Floor
函数中,可以将整个pizzasize
语句包含在1。5年到2年之间。