如何使用EF通过单个查询从MSSQL中选择+1记录?

时间:2019-03-11 06:39:40

标签: c# sql-server entity-framework

简而言之:

我有数据库中具有CreationTime列的记录。我想从过去2天中选择记录,再加上一条随后可能是任何时间的记录(按创建日期desc排序)。

因此,从记录中(知道今天是3月11日),我想选择所有最大存在2天+ 1的记录:

1. 2019-03-11
2. 2019-03-11
3. 2019-03-10
4. 2019-03-08
5. 2019-03-07
6. 2019-03-16

因此,结果应包含记录1,2,3,4。 (4.即使已满3天,我仍需要“ +1”记录)。

我正在使用MSSQL和.NET 4.6.1实体框架。

3 个答案:

答案 0 :(得分:2)

实现此目标的IMO清洁器方法是编写两个查询:首先获取最近两天的数据,其次是获取早于2天的最新记录。

要获取最近2天的记录:

select * from MyTable where CreationTime between getdate() and getdate() - 2

要获取其他记录:

select top 1 * from MyTable where CreationTme < getdate() - 2 order by CreationTime desc

将EF与LINQ方法一起使用(dc是数据库上下文):

要获取最近2天的记录:

dc.Entitites.Where(e => e.CreationTime <= DateTime.Now && e.CreationTime >= DateTime.Now.AddDays(-2));

其他记录:

dc.Entities.Where(e => e.CreationTime < DateTime.Now.AddDays(-2)).OrderByDescending(e => e.CreationTime).First();

答案 1 :(得分:0)

您可以尝试以下查询。

DECLARE @table TABLE(StartDate DATETIME)
INSERT INTO @table
VALUES('2019-03-11'),('2019-03-11'),('2019-03-10'),
      ('2019-03-08'),('2019-03-07'),('2019-03-16')

SELECT * FROM @table WHERE StartDate BETWEEN GETDATE()-4 AND GETDATE()

要获得第4条参赛资格,

SELECT * FROM @table
 ORDER BY (select null)
OFFSET (select Count(*) from @table where  StartDate BETWEEN GETDATE()-2 AND 
        GETDATE()) ROWS
 FETCH NEXT 1 ROWS ONLY

答案 2 :(得分:0)

尝试以下逻辑

DECLARE @T TABLE
(
    SeqNo INT IDENTITY(1,1),
    MyDate DATETIME
)

INSERT INTO  @T
VALUES(GETDATE())
,(DATEADD(MINUTE,-23,GETDATE()))
,(DATEADD(MINUTE,-78,GETDATE()))
,(DATEADD(MINUTE,-5443,GETDATE()))
,(DATEADD(MINUTE,-34,GETDATE()))
,(DATEADD(MINUTE,-360,GETDATE()))
,(DATEADD(MINUTE,-900,GETDATE()))
,(DATEADD(MINUTE,-1240,GETDATE()))
,(DATEADD(MINUTE,-3600,GETDATE()))

;WITH CTE
AS
(
    SELECT
        RN = ROW_NUMBER() OVER(PARTITION BY CAST(MyDate AS DATE) ORDER BY MyDate DESC),
        DateSeq = DATEDIFF(DAY,MyDate,GETDATE()),
        *
        FROM @T
)
SELECT
    *
    FROM CTE
        WHERE 
            DateSeq <2
            OR
            (
                DateSeq = 2
                AND 
                RN = 1
            )