2008-10-21 3 views
1

Я хотел сравнить дату и время, которое находится в этом формате «7/20/2008», с теми, которые находятся в базе данных, которая находится в формате «7/20/2008 7:14:53 AM».Преобразование даты в linq

Я пробовал использовать предложение типа «как», но это не сработало. Предложение «like» использует только строку, а тот, который я использую, - это формат даты.

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

protected void User_Querytime() 
    { 
    DataClasses2DataContext dc1 = new DataClasses2DataContext(); 
    DateTime date1; 


    string date = Request.QueryString.Get("TimeOfMessage"); 
    date1 = Convert.ToDateTime(date); 

    var query7 = from u in dc1.syncback_logs 
       where u.TimeOfMessage = date1 
       orderby u.TimeOfMessage descending 
       select u; 
    GridView1.DataSource = query7; 
    GridView1.DataBind(); 
    } 

ответ

1

Хотя я не могу проверить вашу точную проблему, я смог сравнить даты со следующим кодом.

// Random Date Collection 
    List<DateTime> dateTimes = new List<DateTime>(); 
    dateTimes.Add(DateTime.Parse("7/20/2008 7:14:53 AM")); 
    dateTimes.Add(DateTime.Parse("7/20/2008 7:14:54 AM")); 
    dateTimes.Add(DateTime.Parse("7/20/2009 7:14:53 AM")); 

    DateTime myDateTime = DateTime.Parse("7/20/2008"); 

    var query = from d in dateTimes 
       where d.ToShortDateString() == myDateTime.ToShortDateString() 
       select d; 
+0

Я не думаю, что будет работать (если это произойдет, это будет медленно), потому что вы преобразование в строку сначала (медленное сравнение) и ToShortDateString, я сомневаюсь, что это можно перевести на SQL. – MichaelGG 2008-10-21 18:14:49

0

Вместо того, чтобы сравнивать дату напрямую, сравните два минимальных/максимум, которые вы бы приняли. Поэтому вместо «DbDateCol = mydate» выполните «DbDateCol> = myDate.Date и DbDateCol < myDate.Date.AddDays (1)».

Используя свойство Date, вы отключите компонент времени (заставьте его на 0). Добавив день, вы получите начало следующего дня, ограничив его в дату вашего экземпляра DateTime.

0

Предполагая, что я понять ваш вопрос правильно, вы должны быть в состоянии использовать только

where u.TimeOfMessage.Date == date1 
0

Предполагая, что атрибут TimeOfMessage имеет DateTime, то вы должны быть в состоянии сделать TimeOfMessage.Date == date1

3

Я предполагаю, что у вас проблема, потому что date1 содержит только дату, а ваша база данных содержит полные значения даты/времени. Чтобы найти совпадения, вам нужно выбрать один из следующих способов:

1) Удалите информацию о времени из значений базы данных, прежде чем сравнивать их с вашей целью. 2) Преобразуйте цель в диапазон, а затем найдите значения базы данных в этом диапазоне.

List<DateTime> dateTimes = new List<DateTime>(); 
dateTimes.Add(DateTime.Parse("7/20/2008 7:14:53 AM")); 
dateTimes.Add(DateTime.Parse("7/20/2008 12:12:01 AM")); 
dateTimes.Add(DateTime.Parse("7/21/2008 9:00:00 AM")); 
dateTimes.Add(DateTime.Parse("7/20/2009 7:14:53 AM")); 

DateTime targetDate = Convert.ToDateTime("7/20/2008"); 

// Remove time info from data in database 
var matchingDates = from date in dateTimes 
        where date.Date == targetDate 
        select date; 

// Or use your target date to create a range 
DateTime rangeStart = new DateTime(targetDate.Year, targetDate.Month, targetDate.Day, 0, 0, 0); 
DateTime rangeEnd = new DateTime(targetDate.Year, targetDate.Month, targetDate.Day, 23, 59, 59); 

var matchingDates2 = from date in dateTimes 
        where (date >= rangeStart) && (date <= rangeEnd) 
        select date; 
0
using System.Data.Objects; 

использование выше и изменить запрос, как показано ниже:

var bla = (from log in context.Contacts 
       where EntityFunctions.TruncateTime(log.ModifiedDate) < today.Date 
       select log).FirstOrDefault(); 
Смежные вопросы