在SQL查询中混淆

时间:2012-06-28 06:14:43

标签: sql sql-server tsql

查看表格(例如TRClient)

| ID | clientid | sId |   startdate  |  enddate     |
|----|----------|-----|--------------|--------------|
| 1  |  10      |  1  | '2011-06-01' | '2012-05-31' |
| 2  |  25      |  3  | '2011-06-01' | '2012-05-31' |
| 3  |  10      |  1  | '2012-06-01' | '2013-05-31' |

我希望clientid enddate大于或等于之前的记录enddate (两个记录之间的关系可以由sId确定。)

我做了以下查询:
(这里我在TRClient中为每个客户端ID使用循环)

Select clientid from TRClient where clientId = 10 and sId = 1 and not (endDate >= '2012-05-31') 

我想检查每个客户端的最高id的记录(如果clientid和sId相同,那么它应该仅检查id为更大的一个记录。例如,如果我们在讨论clientid = 10并且在给定的表中sid = 1我们会收到两行(id = 1 and id = 3)。在这里,我想查看enddate >= '2012-05-31' for id = 3)

4 个答案:

答案 0 :(得分:1)

如果数据库中的列datetime并且您想比较它们,那么您还需要一个有效的比较值。

试试这个:

SELECT clientid 
FROM TRClient 
WHERE clientId = 10 
  AND sId = 1 
  AND DATEDIFF(n, startDate,'05/31/2012') > 0

如果您编写像'05 / 31/2012这样的字符串格式的sql server尝试自动转换它。 根据您可能处理月/日的服务器区域设置。

答案 1 :(得分:0)

你是说这个意思吗?

select * from TRClient trc1 join TRClient trc2 on trc1.id = trc2.sid 
where trc1.startDate <= trc2.endDate

select * from TRClient trc1 where exists
(select 1 from TRClient trc2 where trc2.sid = trc1.id and trc1.startDate <= trc2.endDate)

答案 2 :(得分:0)

SELECT ClientID
FROM   TRClient AS TRC1
WHERE  startDate < (SELECT EndDate
                    FROM   TRClient AS TRC2
                    WHERE  TRC2.ID = (SELECT Max(ClientID)
                                      FROM   TRClient AS TRC3
                                      WHERE  TRC3.ID < TRC1.ID)) 

我忘了使用sID和ClientID,但你可以将它们添加到我的代码中,你明白了吗?

答案 3 :(得分:0)

这就是我想要做的事情:

SELECT ClientId FROM TRClient WHERE Id = (SELECT MAX(Id) FROM TRClient
WHERE ClientId = 10 AND sId = 1) AND StartDate >= '2012-05-31'