能否用IIF函数为DATEADD动态选择datepart参数?
DATEADD嵌套IIF函数的问题解析
为什么第一种写法报错?
你的第一种写法不可行,核心原因是DATEADD的第一个参数要求的是语法层面的日期部分关键字(比如year、month),而IIF函数返回的是字符串类型的"year"或"month",这和DATEADD对参数的要求不匹配——DATEADD不接受字符串形式的日期部分参数,必须直接使用关键字。
错误代码示例:
SELECT DATEADD(IIF( 1>2, year, month), 1, '2017/08/25') AS DateAdd;
触发的错误提示:
Invalid parameter 1 specified for dateadd.
可行的写法说明
你第二种写法是正确的,因为它是在IIF内部分别调用DATEADD,此时每个DATEADD的第一个参数都是合法的关键字,IIF只是根据条件返回两个DATEADD计算结果中的一个,完全符合函数参数的类型要求。
正确代码示例:
SELECT IIF( 1>2, DATEADD(year, 1, '2017/08/25'), DATEADD(month, 1, '2017/08/25')) AS DateAdd;
函数嵌套的基本规则
- 内层函数的返回值必须严格匹配外层函数对应参数的类型和语法要求:如果外层函数需要的是语法关键字(而非普通数据类型),就不能用返回普通字符串/数值的函数来替代;
- 当外层函数参数接受表达式返回的普通数据类型(比如日期、数值、字符串)时,才可以嵌套返回对应类型的函数。
内容的提问来源于stack exchange,提问作者Navneet Garg
相关产品推荐
相关产品推荐

