powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Формат даты в SQL запросе
23 сообщений из 23, страница 1 из 1
Формат даты в SQL запросе
    #35122004
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В поле даты [ПолеДаты] на SQL Server дата хранится в формате ##.##.## (например, 19.07.1996)
Как правилно писать дату в SQL-команде?
Я пишу
Select count(ID) where [ПолеДаты] Between '01.07.1996' And '31.07.1996'
Но чета не работает. Выскакивает исключение
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122048
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос для подфорума по SQL Server. Но давайте здесь разберемся.
Судя по вопросу, дата хранится в виде строки. Это так? Если нет, то какой тип данных используется? Если datetime/smalldatetime, то вы неправы относительно формата хранения даты. Если дата хранится как символьное значение (varchar/nvarchar/char/nchar), то BETWEEN в таком виде работать не будет, потому что он будет сравнивать строки, а не даты (разницу понимаете?).
авторВыскакивает исключениеКакое???
В общем информации мало. Укажите структуру таблицы и возникающее исключение.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122050
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет. Команда выполняется. Исключение выбрасывается на строчке
.
.
while(dr.Read())
.
.
dr - объект DataReader
текст исключения -
The conversion of a char data type to datetime data type resulted in a out-of-range datetime value.
at System.Data.SqlClient.SqlDataReader.Read()

о чем тут речь? как исправить?
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122053
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет. дата нестрока. это точно. тип datetime
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122056
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кусок кода где ошибка возникает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
				SqlDataReader dr = cmd.ExecuteReader();

				do
				{
					while(dr.Read())
				{
					for(int i =  0 ; i < dr.FieldCount; i++)
						sb.Append(dr[i].ToString() + "; ");

					sb.Append(Environment.NewLine);
				}

					sb.Append(Environment.NewLine);
				} while(dr.NextResult());

				dr.Close();
				conn.Close();

				resultTextBox.Text = sb.ToString();
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122209
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторThe conversion of a char data type to datetime data type resulted in a out-of-range datetime valueСервер при выполнении BETWEEN пытается преобразовать операнды к типу datetime. Так вот на '31.07.1996' он споткнулся. Почему? Да потому, что он посчитал, что 31 - это месяц.
Варианты решения проблемы:
1) используйте строковое представление дат в формате ANSI. Подробнее см. Books Online.
2) Преобразуйте строки к датам с помощью CONVERT или CAST с явным указанием формата строк. Подробнее также см. Books Online.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122360
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему же он первую дату переварил а споткнулся тока на второй?
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122403
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА почему же он первую дату переварил а споткнулся тока на второй?Ну сами подумайте немного!
"01.07.1996" можно распознать как:
1) 1 июля 1996 года
2) 7 января 1996 года
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122411
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Реально помог. А то бы я вообще закопался
Проблема пока решается так. Сначала пишу МЕСЯЦ, потом ДАТУ, а затем ГОД. Вроде работает. А вот что будет когда придется работать с полем где помиом даты еще и время хранится - черт его знает
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122416
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПроблема пока решается так. Сначала пишу МЕСЯЦ, потом ДАТУ, а затем ГОД. Вроде работает. Поверьте! Это не решение проблемы! Вы просто ушли от проблемы в данных конкретных условиях. Если у вас элементарно поменяются настройки сервера, вы опять столкнетесь с это проблемой.
Корректные варианты решения я уже привел выше.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122424
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял че такое Books Online. Кастинг где делать? В коде приложения или в СУБД?
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122439
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL Server Books Online - документация по SQL Server
CAST/CONVERT - операторы Transact-SQL. Соответсвенно имеется в виду кастинг на уровне SQL-запроса.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122478
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо еще раз.
В MSDN тоже есть инфа.
Воспользовался CONVERT. А CAST наверное не подойдет для даты, там нет параметра Style, как раз отвечающего за формат даты.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122549
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще кое-что по поводу этого запроса. Нужно сделать этот запрос параметризированным. Т.е в качестве параеметра передавать объект Command начальную и конечную дату.
Что то вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
.
.
String sqlText = @"select count(OrderID) From Orders where OrderDate Between @Nachalo And @Konec";
.
.
				SqlCommand cmd = new SqlCommand(sqlText, conn);
				conn.Open();
				cmd.Parameters.Add ("@Nachalo", SqlDbType.DateTime.ToString());
				cmd.Parameters.Add ("@Konec", SqlDbType.DateTime.ToString());
				cmd.Parameters[ 0 ].Value = "01.07.1996";
				cmd.Parameters[ 1 ].Value = "31.07.1996";
				SqlDataReader dr = cmd.ExecuteReader();
Это не работает.
Исключение-
Arithmetic overflow error converting expression to data type datetime
Как это сделать правильно?
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122554
Однако
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTime передавай, а не строку.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122564
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о да!
а что изменится если использовать OleDb провайдер? там же вместо маркеров используются знаки вопроса.
Как добавлять тогда параметры в коллекцию Command.Parameters?
Вот так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
String sqlText = @"select count(OrderID) From Orders where OrderDate Between ? And ?";

cmd.Parameters.Add (?, SqlDbType.DateTime);
cmd.Parameters.Add (?, SqlDbType.DateTime);
cmd.Parameters[ 0 ].Value = "01.07.1996";
cmd.Parameters[ 1 ].Value = "31.07.1996";

...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122565
черный_монах
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там соответсвенно OleDbType.DateTime
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122571
Однако
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTime должно стоять после cmd.Parameters[ююю].Value =
а там где знаки вопроса - любые уникальные идентификаторы. в том же порядке, как в запросе.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122585
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора что изменится если использовать OleDb провайдер?А зачем вам для SQL Server использовать OleDb-провайдер? Используйте родной SqlClient.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122587
Емое...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть два варианта
1) вам уже сказали-передавать Datetime как параметр
2) Использовать стандарт ANSI- YYYYMMDD, т.е. передавать '19960701' и '19960731'-работает при любых настройках SQL сервера(Microsoft-я надеюсь у вас он?)
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35122667
Фотография Ken@t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть ещё несколько правильных
- установить на сессию нужный формат даты SET DATEFORMAT DMY, например
- установить для пользователя необходимые региональные установки представления даты выбрав для "пользователя бд" соответствующий язык.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35129851
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ken@tесть ещё несколько правильных
- установить для пользователя необходимые региональные установки представления даты выбрав для "пользователя бд" соответствующий язык.
Только не для пользователя бд, а для Login-а который "смапирован" на пользователя базы данных.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Формат даты в SQL запросе
    #35129949
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSQL Server дата хранится в формате ##.##.##

авторнет. дата нестрока. это точно. тип datetime

если прочитать второе утверждение, то первое становиться абсурдным.

присваивайте значениям параметров не строковые а DateTime значения и будет вам счастье.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Формат даты в SQL запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]