WHERE 子句中的 Date CAST 不返回项目

Date CAST in WHERE clause does not return items

提问人:xtripled 提问时间:10/17/2023 最后编辑:Joel Coehoornxtripled 更新时间:10/18/2023 访问量:51

问:

我有一个包含 CAST 函数的 SQL 查询的问题,所以这是我的条件:

CASE
  WHEN FYStartMonths = 1 
  THEN 
    'Period ' + CAST((MONTH(EndDate) + 1) / 2 AS VARCHAR) + ' ' + CAST(YEAR(EndDate) AS VARCHAR)
  ELSE
    'Period ' + CAST((MONTH(EndDate) + 1) / 2 AS VARCHAR) + ' ' + CAST(YEAR(EndDate) AS VARCHAR) + ' - ' + CAST(YEAR(DATEADD(YEAR, 1, EndDate)) AS VARCHAR)
END AS FormattedFilingPeriod

所以这样做的结果是这样的

Period 3 2022 - 2023

SELECT 子句如下所示:

SELECT *
FROM ActiveItems
WHERE FormattedFilingPeriod LIKE '%' + 'Period 3 2022 - 2023' + '%'

问题是当我在 SELECT 下添加 WHERE 子句时,如果我指定,它就不会返回项目,它仅在我指定部分类似 or 时返回项目,但 f.e. 不会返回任何内容。我不知道为什么会这样,所以我很高兴听到你的想法。Period 3 2022 - 2023Period2022 - 20233 2022 - 2023

我试图用格式覆盖大小写条件,将转换更改为 AS VARCHAR(MAX),就像这个问题中提到的一样,SQL Cast 在 Select 中有效,但在 Where 子句中不起作用,但这对我不起作用。

sql-server 强制转换 sql-server-2012 where-clause

评论

0赞 Thom A 10/17/2023
考虑到这是在您应该得到一个错误中定义的;不能引用 by 其别名中定义的列。FormattedFilingPeriodSELECTSELECT
2赞 Sean Lange 10/17/2023
sqlblog.org/2009/10/09/......
0赞 xtripled 10/17/2023
FormattedFilingPeriod 在名为 ActiveItems 的 CTE 中定义,忘了提及
0赞 Sean Lange 10/17/2023
也许你应该展示所有的代码,而不仅仅是这里和那里的部分。表定义、示例数据和期望的输出将大大有助于实现这一点。
1赞 Joel Coehoorn 10/17/2023
通过对实际日期值执行 WHERE 子句检查,性能将显著提高

答:

1赞 Joel Coehoorn 10/17/2023 #1

问题中子句的逻辑应等同于此:WHERE

WHERE FYStartMonths = 1
    AND EndDate >= DateFromParts(2022, 5, 1) AND EndDate < DateFromParts(2022, 6, 1) 

相反,像这样编写子句的性能会大大提高,因为您仍然可以在列上使用索引,并且不再对表中的每一行执行转换操作。WHEREEndDate

此外,这应该使问题中问题的修复更加明显。这个问题并不完全清楚,但似乎问题是列中的值在何时不匹配,因为缺少文本。以这种方式编写子句可以很容易地删除该条件。FormattedFilingPeriodFYStartMonths = 1PeriodWHERE

但它看起来也有点像这是基于搜索过滤器的,用户可以在其中输入任何内容或选择某些预先格式化的查询。在这种情况下,最好编写前端代码来解析这些查询,以便它们可以在 SQL 子句表达式中进行翻译,如上所述。WHERE