如何从 Linq 中的日期时间列获取月份名称到 SQL

本文关键字:取月份 获取 SQL 时间 Linq 日期 | 更新日期: 2023-09-27 18:26:41

我的表中有一列DateTime

在 Linq to SQL 查询中,我只需要该字段的月份部分

如何为此编写 Linq 查询?

如何从 Linq 中的日期时间列获取月份名称到 SQL

好吧,我可以立即想到三个选项:

  • 将整个DateTime拉回,然后提取月份并在客户端格式化
  • 使用 DateTime.Month 从数据库中提取月份,然后在客户端设置其格式
  • 尝试使格式设置(转换为文本(在数据库上工作

就个人而言,我不会尝试第三种选择 - 在我看来,它不太可能奏效,至少没有付出很多努力。

怀疑我实际上只是把DateTime拉回来,并在客户端做所有事情。这很容易做到,而且一定会奏效。我希望DateTime.Month可能会工作,但你不会节省很多网络带宽,你会让服务器做一些工作,这对客户端来说可能同样容易。

请注意,如果仍希望将结果作为查询,则可以使用 AsEnumerable 强制在客户端完成查询的其余部分。例如:

var query = db.Customers
              .Where(c => c.OrderCount > 500) // Or whatever query you want
              .Select(c => new { c.Name, c.FirstOrder })
              .AsEnumerable() // Do the rest of the query on the client
              .Select(c => new { c.Name, c.Month = c.FirstOrder.ToString("MMM") });

编辑:如评论中所述,如果它实际上会影响结果,那么在服务器端使用DateTime.Month是有意义的,例如

var query = db.Customers.Where(c => c.FirstOrder.Month == 1)
                        ...

。但在这些情况下,我希望它是重要的数值,而不是月份的名称

像这样:

string monthName = dataContext.GetTable<TableName>()
                              .FirstOrDefault(t => t.DateTimeColumn)
                              .ToString("MMM");               
您需要

使用 ToList() 将表转换为Enumerable类型,因为不能对查询类型使用ToString()

var result = from sales in SalesOrderHeaders.ToList()
    select new {
        Sales_Order_ID = sales.SalesOrderID,
        Territory_ID = sales.TerritoryID,
        Month = sales.OrderDate.ToString("MMMM"),
        Year = sales.OrderDate.Year
};
result.Dump();