MySQL Query选择表中时间值等于当前时间的字段

时间:2017-01-27 23:02:32

标签: mysql c mariadb

我想做的是每分钟运行一个程序。程序使用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);

3 个答案:

答案 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 MySQLhttps://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'