Как выбрать +1 запись из MSSQL, используя EF с одним запросом? - PullRequest
3 голосов
/ 11 марта 2019

Короче говоря:

У меня есть записи со столбцом CreationTime в базе данных.Я хочу выбрать записи за последние 2 дня, плюс одну следующую (сортировка по дате создания desc), которая может быть в любое время.

Таким образом, из записей (зная, что сегодняшняя дата - 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 Entity Framework.

Ответы [ 3 ]

2 голосов
/ 11 марта 2019

Более надежный способ добиться этого - написать два запроса: первый - получить данные за последние два дня, а второй - получить последнюю запись старше 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();
0 голосов
/ 11 марта 2019

Попробуйте следующую логику

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
            )
0 голосов
/ 11 марта 2019

Вы можете попробовать следующий запрос.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...