2014-01-14 4 views
0

Я хочу отфильтровать gridview путем сравнения столбца datetime типа datetime в sql-сервере с текстовым полем даты.дата фильтрации в дате в другом формате


Столбец datetime в sql-сервере хранится/отображается (по умолчанию) в формате yyyy-mm-dd hh: mm: ss.sss.

Однако текстовое поле даты находится в формате dd/mm/yyyy.

<asp:TextBox ID="date_tb" runat="server" TextMode="Date"></asp:TextBox>


Я попытался с помощью FilterExpression="CONVERT(VARCHAR, [ScheduledDateTime], 105) LIKE '%{0}%'"> , но это не сработало.

FilterExpression="CONVERT([ScheduledDateTime], 'System.String', 105) LIKE '%{0}%'"> также не сработало.


Затем я попытался с помощью

SelectCommand="SELECT [ScheduledDateTime], CONVERT(VARCHAR, [ScheduledDateTime], 105) as d ... FROM table1

FilterExpression="d LIKE '%{0}%'">

, но он не работает, как хорошо.



редактировать:

Я изменил ControlParameter в <asp:ControlParameter Name="ScheduledDateTime" ControlID="date_tb" PropertyName="Text" type="DateTime"/>, так что я больше не придется беспокоиться о формате даты.

И все же есть проблема при сравнении date с datetime.

+0

DateTimes хранятся в двоичном виде - они не сохраняются в любом "формате" –

+0

Просто попробуйте это: 'FilterExpression =" Cas t ([ScheduledDateTime] как Date) = '{0}' "'. Но причина в том, что это не так здорово, потому что (я считаю) вам понадобится, чтобы ваш SQL Server работал по британским правилам. Вот почему CAST лучше в том смысле, что он будет работать в любом населенном пункте –

+0

@ T.S. Выражение содержит неопределенный вызов функции cast(). –

ответ

1

Это то, что вы можете сделать

select * from MyTable where convert(varchar, a, 103) = '03/24/2013' 

Вы, вероятно, не хотите сравнить дату секунд. Правая сторона equasion приходит из текстового поля

Если вы хотите действительно хорошо, то сделать это

Dim sql as String = "select * from MyTable where convert(varchar, a, 103) = @1" 

@1 является параметром, который вы хотите добавить в Command Object и это будет иметь значение вашего текстового поля.

+0

Я использую 'FilterExpression', поэтому я не вижу, как это будет работать. –

+0

Мой ответ показывает, как SQL-сервер реагирует на сравнение даты. Если вы заметили, у меня есть формат США - 101. Я только что заметил, вам нужно 103 для dd/mm/yyyy –

+0

Не сравнивать даты, преобразовывая их в строки. Сравните их как даты. – Anon

0

http://msdn.microsoft.com/en-us/library/ms187928.aspx

Использовать формат 103 для преобразования '/ YYYY дд/мм' строка с датой. Вы используете 105, который является «dd-mm-yyyy»

+0

Прошу прощения, но я просто не вижу, как будет работать формат 103. –

+0

Можете ли вы объяснить, что вы имеете в виду, когда заявляете: «Время в сервере sql хранится (по умолчанию) в формате yyyy-mm-dd hh: mm: ss.sss.»? Является ли схема базы данных использующей тип 'datetime' или тип' varchar'? – Anon

+0

столбец datetime в db является типом 'datetime'. по умолчанию значения сохраняются/отображаются в db в формате yyyy-mm-dd hh: mm: ss.sss. поэтому, если я напрямую конвертирую из 'datetime' в' varchar', вывод будет примерно таким же, как '2014-12-31 18: 22: 33: 234'. –

0

Вам не нужно преобразовывать строки для сравнения DateTime s в SQL. Когда вы используете LIKE, SQL преобразует DateTime в строковое значение, и вам нужно убедиться, что вы используете тот же формат на обоих концах.Если источник данных не включает компонент времени, то вы должны просто быть в состоянии сделать:

FilterExpression="ScheduledDateTime = {0}" 

Если делает включают компоненты времени, и вы хотите, чтобы укоротить время, вы можете попробовать:

FilterExpression="dateadd(dd, datediff(dd,0, ScheduledDateTime), 0) = {0}" 

или

FilterExpression="ScheduledDateTime BETWEEN {0} AND dateadd(dd, 1, {0})" 
+0

Я верю, что 'BETWEEN {0} И dateadd (dd, 1, {0})' логически неверно. Вероятно, вы хотите получить дату между датой минус все минуты и т. Д., А также дату + максимальные часы, минуты и т. Д. –

+0

Выражение содержит неопределенный вызов функции dateadd(). –

Смежные вопросы