提问人:xtripled 提问时间:10/17/2023 最后编辑:Joel Coehoornxtripled 更新时间:10/18/2023 访问量:51
WHERE 子句中的 Date CAST 不返回项目
Date CAST in WHERE clause does not return items
问:
我有一个包含 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 - 2023
Period
2022 - 2023
3 2022 - 2023
我试图用格式覆盖大小写条件,将转换更改为 AS VARCHAR(MAX),就像这个问题中提到的一样,SQL Cast 在 Select 中有效,但在 Where 子句中不起作用,但这对我不起作用。
答:
问题中子句的逻辑应等同于此:WHERE
WHERE FYStartMonths = 1
AND EndDate >= DateFromParts(2022, 5, 1) AND EndDate < DateFromParts(2022, 6, 1)
相反,像这样编写子句的性能会大大提高,因为您仍然可以在列上使用索引,并且不再对表中的每一行执行转换操作。WHERE
EndDate
此外,这应该使问题中问题的修复更加明显。这个问题并不完全清楚,但似乎问题是列中的值在何时不匹配,因为缺少文本。以这种方式编写子句可以很容易地删除该条件。FormattedFilingPeriod
FYStartMonths = 1
Period
WHERE
但它看起来也有点像这是基于搜索过滤器的,用户可以在其中输入任何内容或选择某些预先格式化的查询。在这种情况下,最好编写前端代码来解析这些查询,以便它们可以在 SQL 子句表达式中进行翻译,如上所述。WHERE
上一个:计算过去三年的车辆总数
下一个:使用另一个表列更新列
评论
FormattedFilingPeriod
SELECT
SELECT