SQL - 比较没有cusors的行

时间:2011-05-17 19:06:21

标签: tsql

我有一个包含以下列的临时表 -

id              int identity(1,1)   NOT NULL
startDate       dateteime           NOT NULL
endDate         dateteime
amount          decimal(18,8)       NOT NULL

我需要运行一个查询,以便从中获取一个列值。

  • 如果最大startDate是< =今天,然后是与该行对应的金额。
  • 如果分钟。 startDate是> =今天,然后是与该行对应的金额。
  • 如果我们的行startDates小于,等于和大于今天,则startDate最接近< =今天的行应该是应该选择其金额的行。如果今天最接近startDate(< =)的今天endDate比今天少startDate,则选择行的数量,前者旁边有{{1}}。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您搜索最近的startDate。您只能订购表格,然后限制结果集!看看这个:

SET DATEFORMAT DMY

DECLARE @t TABLE (
    id uniqueidentifier NOT NULL, 
    startDate datetime NOT NULL,
    endDate datetime, 
    amount decimal(18,8)  NOT NULL)

INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.01.2009', NULL, 1.221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.03.2009', NULL, 1.221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.10.2011', NULL, 1.22)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '21.04.2011', NULL, 221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '11.06.2011', NULL, 199221)
INSERT INTO @t (id, startDate, endDate, amount)
    VALUES(NEWID(), '01.01.2009', NULL, 1221)

SELECT TOP 1 * FROM @t
ORDER BY ABS(DATEDIFF(day, startDate, GETDATE()))

答案 1 :(得分:0)

通过阅读您的问题,您似乎只想选择startDate最接近当天的行。

我认为这应该会给你,如果没有,请进一步澄清你的要求。可能通过添加一些样本数据和预期输出。

Select Top 1 *
From YourTable
Where startDate = IsNull(
                (Select Max(startDate) from #t where startdate <= getdate()),
                    (Select Min(startDate) from #t where startdate >= getdate())
                        )