Форум программистов, компьютерный форум, киберфорум
Visual C++: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для FROSTEROID
7 / 7 / 1
Регистрация: 15.11.2011
Сообщений: 24

DateTime в SQL запросе к базе данных C++/CLI. Нужен способ сравнить даты

02.05.2013, 17:33. Показов 3996. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пользователь выбирает месяц при помощи dateTimePicker. Нам важен месяц, им выбранный.
(Кстати, можно ли сделать так, чтобы dateTimePicker предоставлял только выбор месяца?)
Получив этот месяц, мы лезем в базу данных с кортежами, в каждом из которых есть поле "Дата" с типом данных Дата/время. (База данных создана в MS Access и, проверено, нормально поддаётся работе с ней.)
Из записей нам нужны только те, в поле "Дата" которых хранится дата, принадлежащая выбранному месяцу.

Поиск осуществлять пытаюсь при помощи SELECT прямо в SQL запросе (Задать условие WHERE хочу).
С радостью почитаю предложения с иными способами. Только не поиск в ДатаГрид'е(/ДатаСет'е) после заполнения.
^_^

Для того, чтобы находить этот "искомый месяц" создаю две переменных, с которыми буду сравнивать значение поля "Дата" из очередного кортежа. Одна из них будет хранить последнее число из предыдущего месяца, а вторая - первое из следующего. "Искомый месяц" - это числа, находящиеся "между" этими двумя.

Написал код, в котором, как я предполагал, в SQLзапросе будут сравниваться даты.
Но, по незнанию, написать запрос правильно не могу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        DateTime selected = dateTimePicker1->Value;  // Берём дату, выбранную пользователем
        
         // *Дата за один день до текущего месяца* - вычитанием из текущей количества дней:
        DateTime prevMonth = selected.AddDays(-selected.Day); //;
        // Дата через день после текущего месяца - прибавлением 1 месяца и вычитанием текущих дней, за исключением одного.
        DateTime nextMonth = selected.AddMonths(1); nextMonth = nextMonth.AddDays(-nextMonth.Day + 1);
        //.
 
        MessageBox::Show("Предыдущий месяц " + prevMonth.ToString() + "; следующий "+ nextMonth.ToString());
 
//      ShedulesAdapter->SelectCommand->CommandText = "SELECT Расписание.* FROM Расписание"; // - Запрос на взятие из таблицы ВСЕГО - работает идеально.
        ShedulesAdapter->SelectCommand->CommandText = "SELECT Расписание.* FROM Расписание " 
                                        +"WHERE [Дата] > convert(DATETIME, '"+prevMonth.ToString()+"', 104)"
                                        +" AND [Дата] < convert(DATETIME, '"+nextMonth.ToString() + "', 104)";
Ну и этот великолепный, по моему полчасаназад'овому мнению, код заставляет программу выпасть с ошибкой о том, что "нет, дружище, такой операции - convert!"

ЧЯДНТ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2013, 17:33
Ответы с готовыми решениями:

Как в базе данных, в запросе сделать так, чтобы пользователь вводил даты, и если такой даты нету, то выводило окно "тако
Как в базе данных, в запросе сделать так, чтобы пользователь вводил даты, и если такой даты нету, то выводило окно &quot;такой даты нет,...

Несоответствие формата даты System.DateTime и DATETIME в SQL Express Edition
Столкнулся с такой проблемой: В System.DateTime дата пишется в формате дд.мм.гггг чч.мм.сс, а DATETIME в SQL Express Edition хочет получать...

Как сравнить Textbox с значениями в базе данных sql
Поместил на форму компонент Edit и назвал его Login Есть sql база данных LP в которой есть два столбца(Login,Password) мне нужно узнать...

4
 Аватар для FROSTEROID
7 / 7 / 1
Регистрация: 15.11.2011
Сообщений: 24
02.05.2013, 17:40  [ТС]
Там в коде есть ещё СообщениевыйБокс - его использовал для проверки полученных переменных.
Можно его игнорировать.
-_-
Миниатюры
DateTime в SQL запросе к базе данных C++/CLI. Нужен способ сравнить даты  
0
 Аватар для FROSTEROID
7 / 7 / 1
Регистрация: 15.11.2011
Сообщений: 24
13.05.2013, 09:35  [ТС]
О, гуру Visual С++ и SQL, пусть давность заданности вопроса Вас не пугает
Очень хочу увидеть Ваш ответ
0
 Аватар для FROSTEROID
7 / 7 / 1
Регистрация: 15.11.2011
Сообщений: 24
28.05.2013, 22:23  [ТС]
ПОЧТИ дописал программу, обойдясь без датосодержащего вопроса к базе. И снова столкнулся с этой проблемой. Мне нужно удалить запись из базы данных. Для этого в DataAdapter'e есть параметр DeleteCommand. Всё ОК, оно работает, йа удаляю записи с восторженным треском мышкоклика, пока не имею дела с DateTime.
Но вот, этот час настал, и мне нужно удалить запись из табла, где ключевое поле содержит ДАТУ!

Собственно, вот костяк процедуры удаления:
C++
1
2
3
4
5
6
7
8
    //...                       
DateTime tmpDate = /*...*/ ;
oleDbConnection1->Open(); 
//... Начало цикла, в котором счётчиком является tmpDate:
ShedulesAdapter->DeleteCommand->CommandText = "Delete * FROM Билеты WHERE Дата = '" + SqlTypes::SqlDateTime::Parse(tmpDate.ToString()).ToString() + "'";
    ShedulesAdapter->DeleteCommand->ExecuteNonQuery(); 
//... Конец цикла.
oleDbConnection1->Close();
Вся эта радость вложена в цикл, где tmpDate представляет собой значение типа DateTime, которое должно стать ключом для удаления очередного кортежа из таблицы.

Если хотите что-то сказать насчёт конвертации в конвертации - не стесняйтесь, мне нужно пополнить список бесполезных отвечаторов.

В целом, мне лишь нужно узнать, как послать DateTime в SQL запрос, чтобы он прожевался.

Ну и давно полюбившийся мне эксепшн:
Миниатюры
DateTime в SQL запросе к базе данных C++/CLI. Нужен способ сравнить даты  
0
 Аватар для FROSTEROID
7 / 7 / 1
Регистрация: 15.11.2011
Сообщений: 24
29.05.2013, 15:11  [ТС]
Всем спасибо за внимание, решение найдено.
Как обычно, всё упиралось в правильный запрос к Гуглу:
http://stackoverflow.com/quest... -ms-access

Надо представить дату в виде YYYY-MM-DD HH:NN:SS.
Для этой гадости йа написал функцию, кушающую DateTime и какающую String'aми:
C++
1
2
3
4
5
6
7
8
9
String ^DateTimeToEatableForMSAccess(DateTime a){
        String ^ b = a.Year.ToString()+"-";
        if(a.Month.ToString()->Length == 2) b+= (a.Month.ToString() + "-"); else b+= ("0" + a.Month.ToString() + "-");
        if(a.Day.ToString()->Length == 2) b+= (a.Day.ToString() + " "); else b+= ("0" + a.Day.ToString() + " ");
        if(a.Hour.ToString()->Length == 2)b+= (a.Hour.ToString()+":"); else b+= ("0" + a.Hour.ToString()+":");
        if(a.Minute.ToString()->Length == 2)b+= (a.Minute.ToString()+":"); else b+= ("0" + a.Minute.ToString()+":");
        if(a.Second.ToString()->Length == 2)b+= (a.Second.ToString()+":"); else b+= ("0" + a.Second.ToString());
        return b;
    }
Да, отвратительный костыль. Если кто-то знает метод пооптимальней - жду уже почти месяц, пишите!

Как бы то ни было, благодаря этому убожеству, я могу взять так и написать:
C++
1
2
ShedulesAdapter->DeleteCommand->CommandText = "Delete * FROM Расписание WHERE Дата = #" + DateTimeToEatableForMSAccess(tmpDate) +"#";
ShedulesAdapter->DeleteCommand->ExecuteNonQuery();
И при выполнении моя программа ни на какой эксепшн своей киберпопой не сядет. ^_^
Стоит заметить, что дату в запросе надо оградить от злого внешнего мира решёточками.

Буду несказанно рад, если все эти мои потуги кому-то ещё помогут.
Ещё больше буду рад предоставлению более красивого метода подачи этого DateTime в SQL запрос к базе MSAccess.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.05.2013, 15:11
Помогаю со студенческими работами здесь

Преобразование даты в SQL запросе
В БД есть две таблицы. В первой таблице поля &quot;дата&quot; (дд.мм.гггг) и &quot;время&quot; (мм:чч:сс) разделены, а во второй таблице &quot;дата и...

Проверка даты в запросе sql
Сначала спрошу если пользователь выполнил действие, и поставить setTimeout (5 минут) на выполнение ajax запроса к php скрипту и...

Формат даты в БД в запросе SQL
Добрый день! Я не имею опыта программирования и тем более не приходилось работать с БД. Поэтому всему учусь с нуля. В общем загружаю базу...

Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition - свой способ передачи данных между формами
Способ с использованием макросов. Средней сложности в реализации и понимании, не знаю, нарушает ли ООП, передача данных возможна в обе...

Хранение DateTime в базе данных
В таблице определен столбец типа DATETIME, через DataRow я успешно получаю, устанавливаю его значения. Теперь задача состоит в том, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru