0

我有这个简单的(测试)表:

在此处输入图像描述

  • namee是工人姓名

  • salaryStep是代表新加薪日期的日期。

我需要找到我目前处于哪一步。(基于给定日期)

例如,如果给定的日期是,2013 nov 11那么我应该在id=2

所以逻辑很简单:

1)通过排序表salarystep DESC

2)从中,取第一个较小的项目@now

但是当我通过

DECLARE @now date = '20131111'
SELECT    TOP 1  salaryStep
FROM   (
           SELECT TOP 100 PERCENT
                  salaryStep
           FROM   [aaa].[dbo].[Table_1]
           ORDER BY
                  salaryStep DESC
       )         a
WHERE  a.salaryStep<=@now

答案是:

2013-10-02--不正确

所以我问:

问题 #1

似乎虽然我在内部 select: 中指定了 order by salaryStep DESC,但枚举确实以该顺序开始。这是为什么 ?

问题2

正确的做法是什么?

要求的结果:

2013-10-15(或 id=2 ,没关系)

4

1 回答 1

1

这应该足够了:

DECLARE @now date = '20131111'
SELECT    TOP 1  salaryStep
FROM [aaa].[dbo].[Table_1]
WHERE  salaryStep<=@now
ORDER BY salaryStep DESC

您的问题 #1 的答案是,您的内部查询的顺序无关紧要,重要的是外部查询顺序TOP 1会受到影响。

一个简单的测试:

create table test(a int)
insert into test values (1)
insert into test values (2)
insert into test values (3)

select top 1 * from
(select top 100 percent a from test order by a desc) x

这将返回 1(无论您使用 时的内部顺序如何TOP 100 PERCENT)。

于 2013-10-02T05:42:43.137 回答