【问题标题】:SQL Server : conditional WHERE-clauseSQL Server:条件 WHERE 子句
【发布时间】:2014-02-19 07:44:21
【问题描述】:

这是我的第一个问题,希望一切顺利!

我所做的是使用 MSSMS 的用户定义(表值)函数,其中有一点,我必须根据函数参数 @Year 查找记录。

当记录超过两年时出现问题,那么它应该列出所有超过两年的记录。我一直在用这个把头撞到墙上,这就是我到目前为止的目标:

WHERE   (
        @Year = YEAR(GETDATE()) AND YEAR(E.ExampleColumnDate) = @Year
        OR
        @Year = YEAR(GETDATE())-1 AND YEAR(E.ExampleColumnDate) = @Year
        OR
        @Year = YEAR(GETDATE())-2 AND YEAR(E.ExampleColumnDate) = @Year
        OR
        @Year <= YEAR(GETDATE())-3 AND YEAR(E.ExampleColumnDate) < @Year
        )

【问题讨论】:

  • 那么,是什么问题?你得到不正确的结果吗?错误信息?感觉它应该看起来“更干净”?
  • 哦,是的。如果年份超过两年,则此代码不会返回任何内容。
  • 好吧,您在上次测试中的 &lt;=&lt; 不匹配 - 那么您给出的输入 @Year 值是什么,您是否有来自多年的数据 之前那个?也许如果您可以添加一些示例数据、@Year 输入值和预期结果,我们可以提供帮助。
  • 哦,我实际上发现我正在努力解决的不是我的代码,而是实际数据是错误的。但感谢您快速回复达米安。尽可能关闭这个问题..

标签: sql-server tsql where-clause conditional-operator


【解决方案1】:
WHERE   (
        (@Year = YEAR(GETDATE()) AND YEAR(E.ExampleColumnDate) = @Year)
        OR
        (@Year = YEAR(GETDATE())-1 AND YEAR(E.ExampleColumnDate) = @Year)
        OR
        (@Year = YEAR(GETDATE())-2 AND YEAR(E.ExampleColumnDate) = @Year)
        OR
        (@Year <= YEAR(GETDATE())-3 AND YEAR(E.ExampleColumnDate) < @Year)
        )

【讨论】:

  • 这是什么答案?您只是重复了 where 子句。没有改善也没有任何cmets
  • 不,那是不同的条款。看括号。
  • @JohnSaunders 你是对的,我没有看到。还有一个问题——这些括号对逻辑或结果没有任何影响
  • 我刚刚接受了关闭这个问题的答案,因为结果很好。
【解决方案2】:

你也可以得到超过两年的记录

;with cte 
as
(
SELECT top 10 DATEDIFF(year,E.ExampleColumnDate, getdate()) as diff, * 
  FROM [yourtablename]
  )
  select * from cte where diff =2

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多