2017-01-27 5 views
0

Я хочу, чтобы программа запускалась каждую минуту. Программа использует код C для получения текущего времени и даты, а затем я пытаюсь получить запрос MySQL для сравнения времени в поле базы данных, чтобы узнать, совпадает ли оно с текущим временем. Я только хочу использовать час и минуту, когда exctraing значение из MySQL, а не секунды. Я не могу заставить MySQL работать.MySQL Query выбирает поля, в которых значение времени в таблице равно текущему времени

Обратите внимание, что% s в коде предназначено для программы C для вставки текущего времени, сгенерированного кодом c.

Вот MySQL:

SELECT active, type, date, time, action, command FROM `Alarm` 
WHERE TIME_FORMAT('time', '%H:%i') = '%s' 

При печати запроса после snprintf пытается вставить переменное время я получаю это как выход, казалось, что он пытается вставить значение в% я и % не с, и что формат времени не работает:

ВЫБОР alarm_active, alarm_category, alarm_date, ALARM_TIME, alarm_action, alarm_command оТ Alarm ГДЕ TIME_FORMAT (ALARM_TIME, '% Н: 6297664') = '< F '

Вот код C:

char buffer[1024]; 
    const char *query = "SELECT alarm_active, alarm_category, alarm_date, alarm_time, alarm_action, alarm_command FROM `Alarm` WHERE (alarm_time='%s')"; 
//const char *query = "SELECT active, type, date, time, action, command FROM `Alarm` WHERE active = '1'"; 


//Checking to see if connection to DB is succefful 
if (mysql_query(conn, query) != 0) 
{ 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    exit(1); 

} else { 

    if (snprintf(buffer, sizeof(buffer), query, current_time) >= sizeof(buffer)) 
    { 
     printf("Issue with Buffer \n"); 
     exit (-1); 

    } 

Остальной код, который получает время:

char current_time [11]; 

time_t raw; 
time(&raw); 

struct tm *time_ptr; 
time_ptr = localtime(&raw); 

now with the "tm", you can format it to a buffer 
char current_date[11]; 
char current_time [11];  

strftime(current_date, sizeof(current_date), "%m/%d/%Y", time_ptr); 
strftime(current_time, sizeof(current_time), "%H:%M", time_ptr); 
+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу «Как спросить», чтобы помочь прояснить этот вопрос. – Olaf

+0

Если вы хотите просто запускать программу каждую минуту: это похоже на использование кувалды, чтобы взломать орех. Настройте хроном работу! – Olaf

+0

Запрос выполняется, но записи не отображаются, что означает, что часть запроса не дает мне желаемых результатов. – Vlad

ответ

1

Вам не нужно код C для этого. Вы можете сделать все в базе данных:

SELECT active, type, date, time, action, command 
FROM `Alarm` 
WHERE TIME_FORMAT(time, '%H:%i') = TIME_FORMAT(now(), '%H:%i') and 
     date = curdate(); 

Однако я настоятельно рекомендую вам не применять этот подход. Вы должны сохранить идентификатор (или, по крайней мере, дату/время) последней обработанной записи. Затем вы должны выбрать все идентификаторы с тех пор.

Ваш предложенный метод имеет значительную возможность работать дважды в одну минуту или не пропустить ни минуты.

+0

IDK, который не был мне – Vlad

+0

Как бы я пошел «Вы должны сохранить идентификатор (или, по крайней мере, дату/время) последней обработанной записи. Затем вы должны выбрать все идентификаторы с тех пор« – Vlad

+0

@ Vlad. , , Это не вопрос, который вы задали. Этот ответ касается вопроса, который вы задали, с редакцией о том, как это не подходит. –

0
TIME_FORMAT('time', '%H:%i') 

Вы помещаете имя вашего time столбца в одинарных кавычках, которые являются строковыми литералами разделителей, не ограничители идентификаторов. Таким образом, вы пытаетесь отформатировать время из строковой строки «время», а не значение столбца с именем time.

Попробуйте это:

TIME_FORMAT(`time`, '%H:%i') 

Вы можете прочитать When to use single quotes, double quotes, and backticks in MySQL и https://dev.mysql.com/doc/refman/5.7/en/identifiers.html


Еще одно соображение. Вы сказали, что используете код C, и я вижу, что у вас есть %s, который я считаю управляющим символом для sprintf(). Вы должны проверить SQL-запрос после, который вы интерполируете в него. Проверьте этот запрос в клиенте командной строки MySQL или в MySQL Workbench.

Или еще лучше, не используйте sprintf(), используйте параметризованные запросы. См. http://lgallardo.com/en/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/ для примера использования параметризованных запросов в C.

+0

Спасибо, но по какой-то причине он по-прежнему не хочет соответствовать тому, где с полем времени на db – Vlad

0
sprintf ... '%%H:%%i' ... %s 

То есть, спрячьте% H и% я от Sprintf, говоря, что те буквальные проценты, а не замещения мест. Только% s следует заменить кодом C. К моменту, когда он доберется до MySQL, это будет строка:

... TIME_FORMAT(`time`, '%H:%i') = '12:34' 
+0

Спасибо, что я собирался исправить проблему%, но даже когда я изменяю запись в БД, чтобы соответствовать текущему время, значение% s в запросе правильное, но оно не указывает его как совпадение. – Vlad

+0

Покажите нам конкретные значения данных и SQL. –

+0

Какие значения данных вы имеете в виду? И SQL в этом вопросе. Я даже попытался изменить тип с момента времени в БД на просто varchar, и введенный в поле позволяет сказать 12:34, поэтому sql будет: query = "SELECT alarm_active, alarm_category, alarm_date, alarm_time, alarm_action, alarm_command FROM 'Alarm' WHERE alarm_time = '% s'"; Таким образом, я получаю удовольствие от преобразования времени, чтобы увидеть, будет ли он работать еще ничего – Vlad