Форум программистов, компьютерный форум, киберфорум
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. Показов 3925. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru