【发布时间】:2018-01-18 23:51:33
【问题描述】:
我有一个表,其中 2 列分别称为 Month 和 Year,并且都是 INT。我需要返回所有小于提供日期的记录。
所以如果我传递以下参数@Month = 8 和@Year = 2017,我想返回2017 年8 月之前的所有记录。实现这一目标的最佳方法是什么?
SELECT * FROM testTable
WHERE year <= @Year AND
month < @Month
是我当前的 SQL。如果我需要显示 2014 年 11 月的记录,这将不起作用
【问题讨论】:
-
您可以添加
case一个月的声明。仅在year = @Year时进行比较 -
如果可能的话,你不应该像这样分隔日期部分。这意味着您将不得不不断地将它们重新组合成一个实际的日期。真正的问题是这意味着您的任何查询都不是 SARGable。以适当的数据类型存储数据将为您节省很多痛苦。
-
@SeanLange 我明白 100%。不幸的是,我没有设计数据库。我不明白为什么我们需要将日期存储在单独的列中。当我们需要向简单查询添加逻辑时,这会变得很困难。无论是在 SP 中还是在代码中。
-
而且我知道有时我们会被其他人为我们继承的糟糕设计所困。也许您可以将计算列添加到表中?如果你让它持久化,你甚至可以索引它。如果可能的话,从性能的角度来看,这将是一种更好的方法。
标签: sql sql-server