2015-09-28 3 views
0

У меня есть следующий SQL запрос для получения счетов между 2 датами:SQL ошибка преобразования сервера

SELECT * 
FROM BILLS 
WHERE 
    UPLOAD_DATE >= Convert(DATETIME, '2015-8-29 00:00:00', 120) 
    AND UPLOAD_DATE <= Convert(DATETIME, '2015-9-28 23:59:59', 120) 

Но когда я выполнить этот запрос, я получаю следующее сообщение об ошибке;

Конверсия удалось при преобразовании даты и/или времени от характера Струнный

Я проверил формат 120 и синтаксис yyyy-mm-dd hh-mi-ss (24h), так что это правильно, на мой взгляд.

Кто знает, что это не так?

+0

Я думаю, что 'UPLOAD_DATE' столбец VARCHAR и некоторые значения не в правильном формате. попробуйте этот оператор для подтверждения: 'select cast (UPLOAD_DATE как DATETIME) FROM Bills'. –

+0

Это столбец DATE – Jonas

+0

Посмотрите на ответы этого сообщения http://stackoverflow.com/questions/14119133/conversion-failed-when-converting-date-and-or-time-from-character-string-while-i , вы можете понять. –

ответ

6

Формат 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' 
+0

Это сделало трюк! – Jonas

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