【问题标题】:How to fetch records from the last X days with minimal number of records using stored procedure or LINQ?如何使用存储过程或 LINQ 以最少的记录数获取过去 X 天的记录?
【发布时间】:2018-12-13 14:01:12
【问题描述】:

我有下表

ID    Date
---------------------------
1     2017-07-13 12:18:07.293
2     2017-07-16 06:36:02.340
3     2017-03-17 06:36:02.340
4     2017-04-18 06:36:02.340
5     2017-02-12 06:36:02.340
6     2018-07-03 06:36:02.340
7     2018-07-04 06:36:02.340

X 代表天数,Y 代表最小记录数。

我需要获取最近 X 天的所有记录,如果返回的记录数少于 Y,则返回最后 Y 个记录。

例如,获取最近 7 天 (x=7) 的记录,而最小记录数为 3,我希望得到:

5   2017-02-12 06:36:02.340
6   2018-07-03 06:36:02.340
7   2018-07-04 06:36:02.340

我编写了以下代码,但我希望对其进行改进:

DateTime minDate = DateTime.UtcNow.AddDays(-numOfDays);
var jobs = myList.Where(x => x.CreatedOnUtc > minDate);
if (jobs.Count() >= minItems)
    return jobs;

int maxId = myList.Max(x => x.Id);
return myList.Where(x => x.Id > maxId - minItems);   

谢谢。

【问题讨论】:

  • 向我们展示您的尝试。你用的是哪个 dbms?
  • @jarlh,谢谢,我已经编辑了我的问题

标签: sql .net linq stored-procedures


【解决方案1】:

这是我在 StackOverflow 上的第一个答案,这样好吗? :-)

我是一名支持 SQL 的人在这里工作,所以这是我的尝试..

DECLARE @X INT -- Number of days
DECLARE @Y INT -- Minimum number of records

SET @X = 7
SET @Y = 3

IF OBJECT_ID('tempdb..#Days') IS NOT NULL DROP TABLE #Days

CREATE TABLE #Days
    (
    RowID INT IDENTITY,
    ID INT,
    [Date] DATETIME
    )

INSERT INTO #Days (ID,[Date]) VALUES (1,'2017-07-13 12:18:07.293')
INSERT INTO #Days (ID,[Date]) VALUES (2,'2017-07-16 06:36:02.340')
INSERT INTO #Days (ID,[Date]) VALUES (3,'2017-03-17 06:36:02.340')
INSERT INTO #Days (ID,[Date]) VALUES (4,'2017-04-18 06:36:02.340')
INSERT INTO #Days (ID,[Date]) VALUES (5,'2017-02-12 06:36:02.340')
INSERT INTO #Days (ID,[Date]) VALUES (6,'2018-07-03 06:36:02.340')
INSERT INTO #Days (ID,[Date]) VALUES (7,'2018-07-04 06:36:02.340')

IF  (
    SELECT  COUNT(1)
    FROM    #Days
    WHERE   CONVERT(DATE,[Date]) >= DATEADD("DD",-1*@x,CONVERT(DATE,GETDATE()))
    ) <= @Y
BEGIN

    SELECT  TOP (@Y) *
    FROM    #Days

END
ELSE
BEGIN

    SELECT   *
    FROM    #Days
    WHERE   CONVERT(DATE,[Date]) >= DATEADD("DD",-1*@x,CONVERT(DATE,GETDATE()))

END

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 2018-02-08
    • 1970-01-01
    • 2022-07-20
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多