Как сделать заказ по времени и только в C #? - PullRequest
2 голосов
/ 05 февраля 2009

У меня это записано в SQL Server:

1- startTime (дата / время): 02.05.2009 08:30 (бразильский формат времени: д / м / г)

2- startTime (дата / время): 02.04.2009 14:30 (бразильский формат времени: д / м / г)

Мое приложение просто записывает время ... дата, которую генерирует сам SQL, получает дату сегодняшнего дня.

Когда я прошу VS 2008 упорядочить эти поля даты и времени, он возвращает мне, что код # 2 находится перед # 1, потому что 02.04.2009 предшествует 5/2/2009.

Но на самом деле я хочу, чтобы он заказывал только по времени и игнорировал дату.

Возможно ли это?

Спасибо !! Андре

Ответы [ 4 ]

9 голосов
/ 05 февраля 2009
from d in dates
     orderby d.TimeOfDay
     select d;

или

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

Примечание: Это будет работать, если это обычный LINQ, а не LINQ-to-SQL. Если вы используете LINQ-to-SQL для запроса вашей базы данных, вам понадобится что-то, что будет переводиться в SQL.

2 голосов
/ 05 февраля 2009

Вы также можете попытаться исправить свое приложение, чтобы оно всегда сохраняло одну и ту же базовую дату со временем (например, «01/01/1900» или что-то еще), и тогда вам не придется каждый раз выполнять все эти медленные и неэффективные операции удаления даты время вам нужно сделать запрос.

Или, как сказал Джоэл, обрежьте или удалите часть даты, прежде чем выполнять вставку или обновление.

1 голос
/ 06 февраля 2009

Ну, вы действительно не можете хранить дату и время без даты, но вы могли бы просто хранить общее количество секунд как двойные (используя метод @ 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

Вы также можете просто сохранить реальное время даты, но всегда перезаписыватье с 01.01.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));
        }
    }
}
0 голосов
/ 05 февраля 2009

Попробуйте это в вашем sql:

ORDER BY startTime - CAST(FLOOR(CAST(startTime AS Float)) AS DateTime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...