Формат ODBC использует две цифры для месяца и даты, то есть 2015-08-29 00:00:00
вместо 2015-8-29 00:00:00
.
Было бы лучше использовать параметры, характерные для даты. В противном случае следует использовать недвусмысленные литералы даты, которые не требуют каких-либо преобразований и не зависят от сортировки.
Полный формат ISO 8601 не требует преобразований, например: 2015-08-29T00:00:00
. Неотделимый формат даты также не требует преобразования, например 20150829
.
Если UPLOAD_DATE
- столбец date
, нет причин указывать временную часть. Запрос можно записать следующим образом:
declare @startDate date, @endDate date
....
Select *
From BILLS
Where UPLOAD_DATE BETWEEN @startDate AND @endDate
Если оператор является частью хранимой процедуры или вызывается ADO.NET, это является предпочтительным способом, например:
var startDate=new DateTime(2015,8,29);
var endDate=startDate.AddMonths(1).AddDays(-1);
var myCmd=new SqlCommand("SELECT .... Where UPLOAD_DATE BETWEEN @startDate AND @endDate");
myCmd.Parameters.Add("@startDate",startDate);
myCmd.Parameters.Add("@endDate",endDate);
....
Использование даты литералы же утверждение может быть:
Select *
From BILLS
Where UPLOAD_DATE BETWEEN '20150829' AND '20150928'
время часть будет требоваться только если UPLOAD_DATE
является datetime
типа. В этом случае, хотя, это легче изменить критерии быть меньше следующей даты:
Select *
From BILLS
Where UPLOAD_DATE >= '20150829' AND UPLOAD_DATE < '20150929'
Я думаю, что 'UPLOAD_DATE' столбец VARCHAR и некоторые значения не в правильном формате. попробуйте этот оператор для подтверждения: 'select cast (UPLOAD_DATE как DATETIME) FROM Bills'. –
Это столбец DATE – Jonas
Посмотрите на ответы этого сообщения http://stackoverflow.com/questions/14119133/conversion-failed-when-converting-date-and-or-time-from-character-string-while-i , вы можете понять. –