【问题标题】:LINQ to SQL - Grouping by hoursLINQ to SQL - 按小时分组
【发布时间】:2009-02-22 15:12:39
【问题描述】:

考虑到列类型是 DateTime,如何按小时对 LINQ to SQL 查询的结果进行分组?

【问题讨论】:

    标签: .net sql linq linq-to-sql


    【解决方案1】:

    这是技术时间的解决方案(无上下文)。

    var query = myDC.Orders
        .GroupBy(x => x.OrderDate.Hour)
        .Select(g => new {
            Hour = g.Key,
            Amount = g.Sum(x => x.OrderAmount)
        });
    

    生成这个:

    SELECT SUM([t1].[OrderAmount]) AS [Amount], [t1].[value] AS [Hour]
    FROM (
        SELECT DATEPART(Hour, [t0].[OrderDate]) AS [value], [t0].[OrderAmount]
        FROM [dbo].[Orders] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    

    这是营业时间的解决方案(上下文相关)。

    DateTime zeroDate = new DateTime(2008, 1, 1);
    
    var query = myDC.Orders
        .GroupBy(x => System.Data.Linq.SqlClient.SqlMethods.DateDiffHour(zeroDate, x.OrderDate)
        )
        .Select(g => new { Hours = g.Key, Amount = g.Sum(x => x.OrderAmount) })
        .Select(x => new { Hour = zeroDate.AddHours(x.Hours), Amount = x.Amount});
    

    生成这个:

    SELECT DATEADD(ms, (CONVERT(BigInt,(CONVERT(Float,[t2].[value2])) * 3600000)) % 86400000, DATEADD(day, (CONVERT(BigInt,(CONVERT(Float,[t2].[value2])) * 3600000)) / 86400000, @p1)) AS [Hour], [t2].[value] AS [Amount]
    FROM (
        SELECT SUM([t1].[OrderAmount]) AS [value], [t1].[value] AS [value2]
        FROM (
            SELECT DATEDIFF(Hour, @p0, [t0].[OrderDate]) AS [value], [t0].[OrderAmount]
            FROM [dbo].[Orders] AS [t0]
            ) AS [t1]
        GROUP BY [t1].[value]
        ) AS [t2]
    

    呃 - bigint/float/milliseconds 的东西很难看而且很难验证。我更喜欢在客户端进行添加:

    var results = myDC.Orders
        .GroupBy(x => System.Data.Linq.SqlClient.SqlMethods.DateDiffHour(zeroDate, x.OrderDate)
        )
        .Select(g => new { Hours = g.Key, Amount = g.Sum(x => x.OrderAmount) })
        .ToList()
        .Select(x => new { Hour = zeroDate.AddHours(x.Hours), Amount = x.Amount});
    

    生成这个:

    SELECT SUM([t1].[OrderAmount]) AS [Amount], [t1].[value] AS [Hours]
    FROM (
        SELECT DATEDIFF(Hour, @p0, [t0].[OrderDate]) AS [value], [t0].[OrderAmount]
        FROM [dbo].[Orders] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    

    这是处理上下文时间的第三种方法。这个对 c# 非常友好,但是数据库中有字符串逻辑(糟糕)。

    var query = myDC.Orders
        .GroupBy(x => new DateTime(x.OrderDate.Year, x.OrderDate.Month, x.OrderDate.Day, x.OrderDate.Hour, 0, 0))
        .Select(g => new { Hour = g.Key, Amount = g.Sum(x => x.OrderAmount) });
    

    生成

    SELECT SUM([t1].[OrderAmount]) AS [Amount], [t1].[value] AS [Hour]
    FROM (
        SELECT CONVERT(DATETIME, (CONVERT(NCHAR(4), DATEPART(Year, [t0].[OrderDate])) + ('-' + (CONVERT(NCHAR(2), DATEPART(Month, [t0].[OrderDate])) + ('-' + CONVERT(NCHAR(2), DATEPART(Day, [t0].[OrderDate])))))) + (' ' + (CONVERT(NCHAR(2), DATEPART(Hour, [t0].[OrderDate])) + (':' + (CONVERT(NCHAR(2), @p0) + (':' + CONVERT(NCHAR(2), @p1)))))), 120) AS [value], [t0].[OrderAmount]
        FROM [dbo].[Orders] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      相关资源
      最近更新 更多