按日期范围对数据进行分组

时间:2011-02-07 14:10:20

标签: linq

我想知道如何根据日期范围选择一系列数据?

我的付款表格中的这些数据格式为dd / mm / yyyy

 Id Date       Amount

 1   4/1/2011  300
 2  10/1/2011  200
 3  27/1/2011  100
 4   4/2/2011  300
 5  22/2/2011  400
 6   1/3/2011  500
 7   1/1/2012  600

截止日期是每月27日。所以我想将下个月27日到26日的所有数据分组到一个小组中。

意思是说我希望输出为此。

 Group 1
 1      4/1/2011   300
 2     10/1/2011   200

 Group 2
 1     27/1/2011   100
 2      4/2/2011   300
 3     22/2/2011   400

 Group 3 
 1      1/3/2011   500

 Group 4 
 1      1/1/2012   600

3 个答案:

答案 0 :(得分:3)

目前还不清楚你的问题。你在查询数据库吗?

如果是这种情况,您会询问日期时间,但似乎您有一个字符串格式的列。

首先,在datetime数据类型中转换数据(或者某些等效的,你使用的是什么数据库引擎?),然后使用这样的分组标准:

GROUP BY datepart(month, dateadd(day, -26, [datefield])), DATEPART(year, dateadd(day, -26, [datefield]))

编辑:

那么,你在Linq? 不同的语言,相同的逻辑:

.GroupBy(x => DateTime
    .ParseExact(x.Date, "dd/mm/yyyy", CultureInfo.InvariantCulture) //Supposed your date field of string data type
    .AddDays(-26)
    .ToString("yyyyMM"));

答案 1 :(得分:1)

如果您要经常这样做,那么值得投资于一个表格,该表格为每个月以及开始和结束日期分配唯一标识符:

CREATE TABLE MonthEndings
(
    MonthID      INTEGER NOT NULL PRIMARY KEY,
    StartDate    DATE NOT NULL,
    EndDate      DATE NOT NULL
);
INSERT INTO MonthEndings VALUES(201101, '27/12/2010', '26/01/2011');
INSERT INTO MonthEndings VALUES(201102, '27/01/2011', '26/02/2011');
INSERT INTO MonthEndings VALUES(201103, '27/02/2011', '26/03/2011');
INSERT INTO MonthEndings VALUES(201112, '27/11/2011', '26/01/2012');

然后您可以使用以下方式准确分组:

SELECT M.MonthID, P.Id, P.Date, P.Amount
  FROM Payments AS P
  JOIN MonthEndings AS M ON P.Date BETWEEN M.StartDate and M.EndDate
 ORDER BY M.MonthID, P.Date;

任何组标题等最好由DBMS处理 - SQL以正确的顺序获取数据,并且检索数据的软件将其呈现给用户。

如果你不能将SQL翻译成LINQ,那就会让我们两个人。对不起,我从未使用过LINQ,所以我不知道涉及到什么。

答案 2 :(得分:0)

SELECT *, CASE WHEN  datepart(day,date)<27 THEN datepart(month,date) 
ELSE datepart(month,date) % 12 + 1 END as group_name 
FROM payment