如何在C#中按时间和时间排序?

时间:2009-02-05 20:04:20

标签: asp.net-mvc linq c#-3.0

我在SQL Server中记录了这个:

1- startTime(datetime):2009年5月2日08:30(巴西时间格式:d / m / y)

2- startTime(datetime):2009年4月2日14:30(巴西时间格式:d / m / y)

我的应用程序只记录时间...它自己生成的SQL的日期是获取今天的日期。

当我要求VS 2008订购这个日期时间字段时,它返回我的代码#2在#1之前,因为4/2/2009在5/2/2009之前。

但是,实际上我希望它只按时间排序并忽略日期。

有可能吗?

谢谢! 安德烈

4 个答案:

答案 0 :(得分:9)

from d in dates
     orderby d.TimeOfDay
     select d;

dates.OrderBy(d => d.TimeOfDay);

注意:只要这是普通的LINQ而不是LINQ-to-SQL,这将有效。如果您使用LINQ-to-SQL查询数据库,则需要将某些内容转换为SQL。

答案 1 :(得分:2)

您也可以尝试修复您的应用,以便它始终与时间保存相同的基准日期(如'01 / 01/1900'或其他),然后您不必每次都执行所有这些缓慢且低效的日期剥离操作你需要进行查询的时间。

或者正如Joel所说,在插入或更新之前截断或剥离日期部分。

答案 2 :(得分:1)

好吧,你没有真正存储没有日期的日期时间,但你可以只将整个秒存储为双倍(使用@ florian的方法)。

如果您仍需要日期,则必须添加第二种方法将其转换回对象中的日期,例如:

public class BusinessObjectWithDate
{
    private string _someOtherDbField = "";
    private double _timeInMS = 0; // save this to the database

    // sort by this? in sql or in code.  You don't really need this 
    // property, since TimeWithDate actually saves the _timeInMS field
    public double TimeInMS {      
        get { return _timeInMS; }
    }
    public DateTime TimeWithDate { // sort by this too, if you want
        get { return (new DateTime(1900,1,1).AddMilliseconds(_timeInMS)); }
        set { _timeInMS = value.TimeOfDay.TotalMilliseconds; }
    }
}

var f = new BusinessObjectWithDate();
MessageBox.Show( f.TimeWithDate.ToString() );  // 1/1/1900 12:00:00 AM
f.TimeWithDate = DateTime.Now;
MessageBox.Show( f.TimeWithDate.ToString() );  // 1/1/1900 1:14:57 PM

您也可以只存储实际日期时间,但在设置值时始终用1/1/1900覆盖。这也适用于sql

public class BusinessObjectWithDate
{
    private DateTime _msStoredInDate;
    public DateTime TimeWithDate
    {
        get { return _msStoredInDate; }
        set {
            var ms = value.TimeOfDay.TotalMilliseconds;
            _msStoredInDate = (new DateTime(1900, 1, 1).AddMilliseconds(ms));
        }
    }
}

答案 3 :(得分:0)

在你的sql中试试这个:

ORDER BY startTime - CAST(FLOOR(CAST(startTime AS Float)) AS DateTime)