我想做的是每分钟运行一个程序。程序使用C代码获取当前时间和日期,然后我尝试获取MySQL查询以比较数据库字段中的时间,以查看它是否与当前时间匹配。我只想在从MySQL中提取值而不是秒时使用小时和分钟。我似乎无法让MySQL查询工作。
注意代码中的%s是C程序插入c代码生成的当前时间。
这是MySQL:
SELECT active, type, date, time, action, command FROM `Alarm`
WHERE TIME_FORMAT('time', '%H:%i') = '%s'
当我在snprintf尝试插入时间变量后打印查询时,我将此作为输出,似乎它试图将值插入%i而不是%s,并且时间的格式是不工作:
SELECT alarm_active,alarm_category,alarm_date,alarm_time,alarm_action,alarm_command FROM Alarm
WHERE TIME_FORMAT(alarm_time,'%H: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 :(得分: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();
但是,我强烈建议您不要采用这种方法。您应该存储最后处理记录的ID(或至少是日期/时间)。然后你应该从那时起选择所有的ID。
您建议的方法很有可能在同一分钟内跑两次或错过一分钟。
答案 1 :(得分:0)
TIME_FORMAT('time', '%H:%i')
您将time
列的名称放在单引号中,它是字符串文字分隔符,而不是标识符分隔符。因此,您尝试从文字字符串“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(),使用参数化查询。有关在C中使用参数化查询的示例,请参阅http://lgallardo.com/en/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/。
答案 2 :(得分:0)
sprintf ... '%%H:%%i' ... %s
也就是说,通过说那些是字面百分比而不是替换位置来隐藏sprintf中的%H和%i。只有%s将被替换为C代码中的 。当它到达MySQL时,它将是这个字符串:
... TIME_FORMAT(`time`, '%H:%i') = '12:34'