【问题标题】:Get week of date from linq query从 linq 查询中获取日期的星期
【发布时间】:2009-08-16 19:46:40
【问题描述】:

我正在尝试从数据库中获取日期的星期,并将其与用户从 DateTimePicker 中选择的值进行比较。我的用户可以选择一天,我写了一个类,以 1 到 52 的形式为我提供当天的星期几。我试图选择 get LINQ 来比较数据库中给定日期的周数和由用户。示例:

var report = (from orders in Context.Orders
              where DateEx.ISOWeekNumber(orders.Date) == 
                    DateEx.ISOWeekNumber(datepicker1.Value)
              select orders);

但它根本不起作用,因为 LINQ 没有 ISOWeekNumber 的翻译。 有谁知道我该怎么做?

【问题讨论】:

  • 看起来有人有一个 blog post 谈论这样做有几种不同的方式。

标签: linq week-number


【解决方案1】:

类似的东西呢?

Math.Truncate(date.DayOfYear/7) +1

给你:

var report = (from orders in Context.Orders
    where Math.Truncate(orders.Date.DayOfYear/7) + 1 ==
    Math.Truncate(datepicker1.Value.DayOfYear/7) + 1
    select orders);

希望对你有帮助,

可能将 Math.Truncate(date.DayOfYear/7) 带入您的新 DateEx 类

【讨论】:

  • 您需要检查一下闰年的 12 月 31 日!
  • 非常感谢。这成功了。我只需要确保我赶上了闰年,但它工作得很好。再次感谢您。
【解决方案2】:

您可以编写一个完全满足您需要的 C# 方法。 LINQ 的优点之一是,当您编写查询时,您可以使用完整编程语言的所有工具。

在 Google 上快速搜索“isoweeknumber c#”,结果如下:

private int weekNumber(DateTime fromDate)
{
    // Get jan 1st of the year
    DateTime startOfYear = fromDate.AddDays(- fromDate.Day + 1).AddMonths(- fromDate.Month +1);
    // Get dec 31st of the year
    DateTime endOfYear = startOfYear.AddYears(1).AddDays(-1);
    // ISO 8601 weeks start with Monday
    // The first week of a year includes the first Thursday
    // DayOfWeek returns 0 for sunday up to 6 for saterday
    int[] iso8601Correction = {6,7,8,9,10,4,5};
    int nds = fromDate.Subtract(startOfYear).Days  + iso8601Correction[(int)startOfYear.DayOfWeek];
    int wk = nds / 7;
    switch(wk)
    {
        case 0 :
            // Return weeknumber of dec 31st of the previous year
            return weekNumber(startOfYear.AddDays(-1));
        case 53 :
            // If dec 31st falls before thursday it is week 01 of next year
            if (endOfYear.DayOfWeek < DayOfWeek.Thursday)
                return 1;
            else
                return wk;
        default : return wk;
    }
}

来源:http://codebetter.com/blogs/peter.van.ooijen/archive/2005/09/26/132466.aspx

【讨论】:

    【解决方案3】:

    我使用了位于 System.Globalization 命名空间中的 Calendar.GetWeekOfYear。

    MSDN Link

            DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
            DateTime specifiedDate = DateTime.Now;
            Calendar cal = dfi.Calendar;
            int weekNo = cal.GetWeekOfYear(specifiedDate, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
            var dataForWeek = data.Where(x => cal.GetWeekOfYear(x.DeliveryDate.Value, dfi.CalendarWeekRule, dfi.FirstDayOfWeek) == weekNo);
    

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 1970-01-01
      • 2018-06-12
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多