在C#中按日期时间的日期排序

本文关键字:日期 时间 排序 | 更新日期: 2023-09-27 18:28:54

我有一个web应用程序,它在GridView中显示当前月份的员工生日。

生日存储在SQL Server 2008数据库中,它们存储为完整的日期时间,即YYYY-MM-DD HH:MM:SS.000。

查询是在视图中完成的。我想按月份的日期对它们进行排序示例:

John Smith Mar 1
Sally Smith Mar 5
Benny Smith Mar 16

问题是linq语句按照他们出生的年份和日期对他们进行排序。因此,如果Sally出生于1962年,John和Benny出生于1988年,那么GridView显示如下:

Sally Smith Mat 5
John Smith Mar 1
Benny Smith Mar 16

在四处挖掘之后,我试着这样做,这里的另一个问题说会奏效。

List<BirthdayCurrentMonthView> record =
                (from tab in db.BirthdayCurrentMonthViews
                 orderby tab.Birthday ascending
                  select tab).ToList();

                string customFormat = "MMM d";
                var ud = record.Select(d => new
                {
                    d.FirstLast,
                    Formattedate = d.Birthday.ToString(customFormat)
                })
                .Distinct()
                .OrderByDescending(d => d.FormattedDate);
                this.grdBirthdays.DataSource = record;
                this.grdBirthdays.DataBind();

问题是我一直得到错误:"方法"ToString"不重载,需要1个参数"

我看到的例子都是这样做的,所以我不知道它为什么不接受它

如果你能帮助我那就太好了。我只希望GridView上的行按天显示。谢谢

生日当前月份查看:

SELECT EmployeeID, ActiveDirectoryName, FirstName, LastName, FirstName + ' ' + LastName   AS FirstLast, Birthday, Anniversary, IsActive
FROM         dbo.Employee
WHERE     (DATEPART(month, Birthday) = DATEPART(month, GETDATE()))
EmployeeID (int, not null)
ActiveDirectoryName (varchar(100), null)
FirstName (varchar(50), not null)
LastName (varchar(100), not null)
FirstLast (varchar(151), not null)
Birthday (datetime, null)
Anniversary (datetime, null)
IsActive (bit, null)

C#中的生日定义:

public Nullable<global::System.DateTime> Birthday
    {
        get
        {
            return _Birthday;
        }
        set
        {
            OnBirthdayChanging(value);
            ReportPropertyChanging("Birthday");
            _Birthday = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("Birthday");
            OnBirthdayChanged();
        }
    }

更新:

解决方案:

List<BirthdayCurrentMonthView> record =
                (from tab in db.BirthdayCurrentMonthViews
                 orderby ((DateTime)tab.Birthday).Day ascending
                  select tab).ToList();

感谢所有人

在C#中按日期时间的日期排序

听起来Birthday没有被识别为DateTime。如果你这样做会发生什么:

((DateTime)d.Birthday).ToString(customFormat)

这将强制生日为DateTime。请记住,如果这不是一个有效的DateTime,那么它将抛出一个错误。

但是,您应该先运行OrderBy语句,然后执行格式化。对字符串进行排序将按ABC排序,而不是按日期排序。

这有什么问题?

List<BirthdayCurrentMonthView> record =
                (from tab in db.BirthdayCurrentMonthViews
                 orderby tab.Birthday.Day ascending
                  select tab).ToList();

日期时间。日期是你要求的。显然,我仍然假设您的数据上下文将Birthday映射为DateTime

更新,错误可能是因为Nullable吗?Nullable没有ToString(arg)方法-请先获取Value。

如果我有一个DateTime?的列表,我只需要堆叠订单并使用HasValue

  var bdates = new List<Tuple<string, DateTime?>>();
  bdates.Add(Tuple.Create("Sally", (DateTime?)new DateTime(1962, 1, 1)));
  bdates.Add(Tuple.Create("John", (DateTime?)new DateTime(1988, 2, 1)));
  bdates.Add(Tuple.Create("Benny", (DateTime?)new DateTime(1988, 1, 1)));
  bdates.Add(Tuple.Create("Joe", (DateTime?)new DateTime(1988, 1, 2)));
  bdates.Add(Tuple.Create("Bob", (DateTime?)null));
  var v = bdates
    .Where(bdate => bdate.Item2.HasValue)
    .OrderBy(bdate => bdate.Item2.Value.Day)
    .OrderBy(bdate => bdate.Item2.Value.Month);