简而言之:
我有数据库中具有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实体框架。
答案 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
)