这个问题是从这里提出的优秀问题中提取出来的:
就我而言,我不关心该WHERE
子句,而是关心加入具有类型列的事件表DATE
一个表有DATETIME2
,另一个有DATE
......所以我可以有效地JOIN
使用aCAST( AS DATE)
或者我可以使用“传统”范围查询(>=日期和<日期+1)。
我的问题是哪个更可取?这些DATETIME
值几乎永远不会与谓词DATE
值匹配。
我希望保持在 200 万行DATETIME
和 5000行以下DATE
(如果这个考虑有所不同)
我是否应该期望在JOIN
使用该WHERE
子句时具有相同的行为?我应该更喜欢哪个通过缩放来保持性能?答案是否随 MSSQL 2012 而改变?
我的通用用例是将我的事件表视为日历表
SELECT
events.columns
,SOME_AGGREGATIONS(tasks.column)
FROM
events
LEFT OUTER JOIN
tasks
--This appropriately states my intent clearer
ON CAST(tasks.datetimecolumn AS DATE) = events.datecolumn
--But is this more effective/scalable?
--ON tasks.datetimecolumn >= events.datecolumn
--AND tasks.datetimecolumn < DATEADD(day,1,events.datecolumn)
GROUP BY
events.columns
Run Code Online (Sandbox Code Playgroud)