yarian misaq Ответов: 3

Тип данных двух полей string но я хочу сравнить через тип данных datetime


hello
my table in my database have 3field
datatype of two field is string but i want compare via datatype datetime
for example:
create table [dbo].[tbluser]{(
[A] datetime,
[B] datetime,
[C] nvarchar(50),
)};
dataclassesdatacontext db = dataclassesdatacontext();
datetime DT1 = new datetime();
DT1 = datetime.now;
DT1 = datetime.now;
datetime DT2 = new datetime();
var query = db.tbluser.where(x=>x.A > DT1 && x.B <= DT2).tolist();
foreach(var itam in query){
Messagebox.show(item.C);
}
note : i am don't want change datetype in table
note 2 : in datafield "A" and "B" are string of datetime
please help
regards
yarian


Что я уже пробовал:

привет
моя таблица в моей базе данных имеет 3 поля
тип данных двух полей string но я хочу сравнить через тип данных datetime

3 Ответов

Рейтинг:
7

yarian misaq

IAm Solve This Proble Shoud User Convert.ToDateTime And Six This
var query = db.tbluser.where(x => Convert.ToDateTime.Parse(x.A) > DT1 && Convert.ToDateTime.Parse(x.B) <= DT2).tolist();


Рейтинг:
2

BillWoodruff

В то время как большой выигрыш здесь будет заключаться в том, чтобы каким-то образом получить то, что извлекается из базы данных как тип DateTime, а не тип String, однако ...

DateTime dt1, dt2;

private bool DateInRange(DateTime dstart, DateTime dend, string str1, string str2)
{
    if (DateTime.TryParse(str1, out dt1) && DateTime.TryParse(str2, out dt2))
    {
        if (dstart > dt1 && dend <= dt2) return true;
    }
    else
    {
        // write error message ?
        // throw error ?
    }

    return false;
}
Пример теста:
DateTime date1 = new DateTime("2016,06,11");
DateTime date2 = new DateTime("2016,11,22");

bool test1 = DateInRange(date1, date2, "06/02/2016", "11/23/2016");
Так юр LINQ-запрос может выглядеть следующим образом:
var query = db.tbluser
     .where(x => DateInRange(date1, date2, X.A, X.B)).ToList();


yarian misaq

Здравствуйте BillWoodRuff
Я не знаю этого кода " DateTime.Метод tryparse(стр2, вне ст2)"
пожалуйста помочь

Рейтинг:
0

P_Z

Привет,

Таким образом, 2 поля ([A] и [B]) в базе данных являются строками.
Эти 2 поля ([A] и [B]) должны быть сопоставлены с DT1 и DT2

datetime DT1 = new datetime();
DT1 = datetime.now;
DT1 = datetime.now; //extra 
datetime DT2 = new datetime(); //to set value for DT2 


Можете ли вы попытаться изменить эту линию
var query = db.tbluser.where(x=>x.A > DT1 && x.B <= DT2).tolist();

к:
var query = db.tbluser.where(x => DateTime.Parse(x.A) > DT1 && DateTime.Parse(x.B) <= DT2).tolist();

Ссылка, связанная с DateTime в C# значение datetime.Метод Синтаксического Анализа (Система)[^]

На другой ноте, вам нужно .Вызова метода toList()? Это приведет к загрузке объектов в память и может вызвать проблемы, если у вас есть большой список записей.
var query = db.tbluser.where(x => DateTime.Parse(x.A) > DT1 && DateTime.Parse(x.B) <= DT2);
foreach(var itam in query){
Messagebox.show(item.C);
}


yarian misaq

Этот Код Является Ошибкой
Система Метода.Датавремя Разобрать(Системы.Строка)' не поддерживается перевод на SQL.

P_Z

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

На мой взгляд, если база данных поддерживает типы datetime и date, вы должны использовать их для полей даты. Здесь может быть обходной путь, но я бы не стал этого предлагать.

То, что вы можете попробовать, - это строка.Сравнивать:
https://msdn.microsoft.com/en-us/library/cc165449.aspx

Вы должны быть уверены, что оба поля в базе данных и сравниваемые переменные имеют один и тот же формат, например гггг-ММ-ДД.
таким образом, запрос будет выглядеть примерно так:
string strDT1 = DT1. ToString("yyyy-MM-dd"); / / аналогично для DT2

ВАР запрос = БД.tbluser.Где (x = & gt; String.Сравните (x.A, strDT1) > 0 && String.Сравните(x. B, strDT2) <= 0);

Опять же, неясно, верны ли возвращенные результаты.

yarian misaq

Иам Решения Этой Проблемы Пользователь Должен Преобразовать.ToDateTime И Шесть Это
var query = db.tbluser.where(x => Convert.Сегодня время.Разбора(х.А) &ГТ; СТ1 &&усилителя; конвертировать.Сегодня время.Разбора(х.Б) &ЛТ;= ст2).список();

P_Z

Когда вы используете .ToList () или .Метод toArray()
сначала все записи будут извлечены из таблицы в память и
затем методы C#, такие как Convert.ToDateTime или DateTime.Синтаксический анализ и т. д. будет применяться в условиях, где

Без этого .ToList() , где условие вычисляется в базе данных, поэтому несколько методов C# не могут быть использованы (как это произошло в данном случае)

Также обратите внимание, что для таблиц с небольшим количеством записей.ToList может работать нормально, но если у вас много записей (например, миллионы) и несколько связанных таблиц, entity framework попытается загрузить весь граф объектов в память, что, скорее всего, приведет к ошибке.