我们的SQL Server数据库在我们的会计期间有一个字符串“2018001”,我将其转换为展平日期:
CONVERT(DATE, CONCAT(LEFT(FP_Based_on_Comm_Date, 4), '-', RIGHT(FP_Based_on_Comm_Date, 2), '-', '1'), 102) AS FP_DATE,
为了按日期汇总销售额并过滤日期>= '2015-01-01'
,最好使用:
CONVERT(DATE, CONCAT(LEFT(FP_Based_on_Comm_Date, 4), '-', RIGHT(FP_Based_on_Comm_Date, 2), '-', '1'), 102) >= '2015-01-01'
在HAVING
或WHERE
子句?
e.g。
SELECT
SUM(Net_Value),
CONVERT(DATE, CONCAT(LEFT(FP_Based_on_Comm_Date, 4), '-', RIGHT(FP_Based_on_Comm_Date, 2), '-', '1'), 102) AS FP_DATE
FROM
DB123
WHERE
CONVERT(DATE, CONCAT(LEFT(FP_Based_on_Comm_Date, 4), '-', RIGHT(FP_Based_on_Comm_Date, 2), '-', '1'), 102) >= '2015-01-01'
GROUP BY
CONVERT(DATE, CONCAT(LEFT(FP_Based_on_Comm_Date, 4), '-', RIGHT(FP_Based_on_Comm_Date, 2), '-', '1'), 102)
答案 0 :(得分:3)
如果您可以过滤where
子句中的条件,那通常会更好。
聚合之前的过滤通常意味着聚合的行数更少 - 因此性能更好。
在某些(非常罕见的)情况下,在where
子句中进行过滤可能会阻止使用索引或生成最佳统计信息,从而导致更糟糕的查询计划。我相信这是相当罕见的。