我有一个查询项,它按日期列过滤记录,格式为'YYYYMM
'。到目前为止,我已经硬编码了Detail filters
中的[DateCol] = '201406'
值,以获得当前的月份和年份记录。但我想动态地改变这个值。下个月,它应该在"201407"之前过滤记录。我该如何做到这一点?我试着在Detail filters
:
[DateCol]
[DateCol] = extract(year, current_date) + extract(month, current_date)
但是它返回了一个错误:
UDA-SQL-0460 The operation "equal" is invalid for the following combination of data types: Character and Integer
请指导
另一个公式
[DateCol] = cast(extract(year, current_date) * 100 + extract(month, current_date) as varchar(6))
最简单的解决方案是创建我所说的"月键",它是年份和月份的整数表示。然后可以将其转换为char进行比较。其实很简单:
extract(year, current_date) * 100 + extract(month, current_date)
任何数字乘以100的结果是在最后加两个0。今年是2014年,所以2014乘以100等于201400。然后,您可以自由地添加月份以获得"月键"。201400 + 6 = 201406。然后可以将该整数转换为字符并进行比较。最终的过滤器表达式变成:
[DateCol] = cast(extract(year, current_date) * 100 + extract(month, current_date), char(6))
注意:为日期制作整数"键"的技术也可以扩展到天,并且有许多应用,即排序。下面的表达式将为您提供一个整数'day key',它保留了原始日期的数字顺序和层次结构:
extract(year, current_date) * 10000 + extract(month, current_date) * 100 + extract(day, current_date)
有两个问题。DateCol的数据类型是字符。提取函数返回整数。其次,你没有正确地用你的摘录构建YYYYMM。你的方法是提取年份作为一个数字,然后加上月份。你最终得到的结果是"201406"= 2020,这是行不通的。因此,您需要强制转换两个摘录并将它们连接起来:
[DateCol] = cast(extract(year, current_date) as varchar(4)
+ cast (extract(month, current_date) as varchar(2))
编辑:实际上,它可能比这更复杂。Extract不会返回6月份的06,只返回6。因此,您需要确定该摘录是一个字符还是两个字符。如果它是1,你需要在转换它之后在前面加一个"0"。确切的语法将取决于您的数据库,但是像这样:
[DateCol] = cast(extract(year, current_date) as varchar(4)
+ case when cast (extract(month, current_date) as varchar(2) = 1
then '0' + cast (extract(month, current_date) as varchar(2)
else cast (extract(month, current_date) as varchar(2)
end