2013-01-10 229 views
1

我有以下数据库结构:mysql日期/时间计算

mysql> select * from scheduler;

+----+-------------------+-----------+-----------+-----------+---------+----------+ 
    | id | name    | daystart | hourstart | dayend | hourend | tariff | 
    +----+-------------------+-----------+-----------+-----------+---------+----------+ 
    | 6 | Monday morning | Monday | 00:00  | Monday | 06:00 | economic | 
    | 8 | Monday night  | Monday | 22:00  | Monday | 00:00 | economic | 
    | 10 | Tuesday morning | Tuesday | 00:00  | Tuesday | 06:00 | economic | 
    | 12 | Tuesday night  | Tuesday | 22:00  | Tuesday | 00:00 | economic | 
    | 14 | Wednesday morning | Wednesday | 00:00  | Wednesday | 06:00 | economic | 
    | 16 | Wednesday night | Wednesday | 22:00  | Wednesday | 00:00 | economic | 
    | 18 | Thursday morning | Thursday | 00:00  | Thursday | 06:00 | economic | 
    | 20 | Thursday night | Thursday | 22:00  | Thursday | 00:00 | economic | 
    | 22 | Friday morning | Friday | 00:00  | Friday | 06:00 | economic | 
    | 24 | Friday night  | Friday | 22:00  | Friday | 00:00 | economic | 
    | 26 | Saturday   | Saturday | 00:00  | Saturday | 00:00 | economic | 
    | 28 | Saturday   | Sunday | 00:00  | Sunday | 00:00 | economic | 
    | 30 | Monday regular | Monday | 06:00  | Monday | 22:00 | regular | 
    | 32 | Tuesday regular | Tuesday | 06:00  | Tuesday | 22:00 | regular | 
    | 34 | Wednesday regular | Wednesday | 06:00  | Wednesday | 22:00 | regular | 
    | 36 | Thursday regular | Thursday | 06:00  | Thursday | 22:00 | regular | 
    | 38 | Friday regular | Friday | 06:00  | Friday | 22:00 | regular | 
    +----+-------------------+-----------+-----------+-----------+---------+----------+ 

    mysql> select * from rate_tariffs; 
    +----+----------+----------+-------+----------+ 
    | id | name  | group_id | price | currency | 
    +----+----------+----------+-------+----------+ 
    | 2 | economic |  1 | 15.30 | UTT  | 
    | 4 | economic |  3 | 23.40 | UTT  | 
    | 6 | economic |  5 | 29.70 | UTT  | 
    | 8 | regular |  1 | 18.00 | UTT  | 
    | 10 | regular |  3 | 27.00 | UTT  | 
    | 12 | regular |  5 | 34.20 | UTT  | 
    | 14 | economic |  7 | 3.00 | UTT  | 
    | 16 | regular |  7 | 4.00 | UTT  | 
    +----+----------+----------+-------+----------+ 

这是什么:它是一种调度应选择使用基于当前日期和时间是什么关税。

我正在寻找使用单个MySQL查询获取此信息。

我有什么,到目前为止,这是因某些原因无法正常工作:

mysql> select scheduler.name, rate_tariffs.name, scheduler.id, rate_tariffs.id, 
    CURTIME(), (EXTRACT(HOUR_MINUTE FROm CURTIME()) - REPLACE(hourstart,':',"")) as 
    diff , daystart, hourstart,dayend,hourend from rate_tariffs inner join scheduler 
    on rate_tariffs.name=tariff where daystart=DATE_FORMAT(CURDATE(),'%W') and 
    dayend=DATE_FORMAT(CURDATE(),'%W') and (EXTRACT(HOUR_MINUTE FROm CURTIME()) - 
    REPLACE(hourstart,':',"")) >0 and (REPLACE(hourend,':','') - EXTRACT(HOUR_MINUTE 
    FROM CURTIME())) >0 and group_id=1; 

    +------------------+----------+----+----+-----------+------+----------+-----------+----------+---------+ 
    | name    | name  | id | id | CURTIME() | diff | daystart | hourstart | dayend | hourend | 
    +------------------+----------+----+----+-----------+------+----------+-----------+----------+---------+ 
    | Thursday morning | economic | 18 | 2 | 01:01:44 | 101 | Thursday | 00:00  | Thursday | 06:00 | 
    +------------------+----------+----+----+-----------+------+----------+-----------+----------+---------+ 
    1 row in set (0.00 sec) 

    mysql> 

不幸的是,这是不是所有的工作时间。

例如,星期三23:45:23小时不起作用。一小时后,同样的查询正在工作(显示星期四)。

关于如何使这项工作更好(实际上使其工作)的任何想法? 您可以在单个SQL查询中使用其他方法吗? 你会以任何其他方式做到这一点?

PS:这里的表信息:

INSERT INTO `scheduler` VALUES (6,'Monday morning','Monday','00:00','Monday','06:00','economic'),(8,'Monday night','Monday','22:00','Monday','00:00','economic'),(10,'Tuesday morning','Tuesday','00:00','Tuesday','06:00','economic'),(12,'Tuesday night','Tuesday','22:00','Tuesday','00:00','economic'),(14,'Wednesday morning','Wednesday','00:00','Wednesday','06:00','economic'),(16,'Wednesday night','Wednesday','22:00','Wednesday','00:00','economic'),(18,'Thursday morning','Thursday','00:00','Thursday','06:00','economic'),(20,'Thursday night','Thursday','22:00','Thursday','00:00','economic'),(22,'Friday morning','Friday','00:00','Friday','06:00','economic'),(24,'Friday night','Friday','22:00','Friday','00:00','economic'),(26,'Saturday','Saturday','00:00','Saturday','00:00','economic'),(28,'Saturday','Sunday','00:00','Sunday','00:00','economic'),(30,'Monday regular','Monday','06:00','Monday','22:00','regular'),(32,'Tuesday regular','Tuesday','06:00','Tuesday','22:00','regular'),(34,'Wednesday regular','Wednesday','06:00','Wednesday','22:00','regular'),(36,'Thursday regular','Thursday','06:00','Thursday','22:00','regular'),(38,'Friday regular','Friday','06:00','Friday','22:00','regular'); 

    INSERT INTO `rate_tariffs` VALUES (2,'economic',1,'15.30','UTT'),(4,'economic',3,'23.40','UTT'),(6,'economic',5,'29.70','UTT'),(8,'regular',1,'18.00','UTT'),(10,'regular',3,'27.00','UTT'),(12,'regular',5,'34.20','UTT'),(14,'economic',7,'3.00','UTT'),(16,'regular',7,'4.00','UTT'); 

    CREATE TABLE `scheduler` (
    `id` int(3) NOT NULL AUTO_INCREMENT, 
    `name` varchar(30) DEFAULT NULL, 
    `daystart` varchar(15) DEFAULT NULL, 
    `hourstart` varchar(6) DEFAULT NULL, 
    `dayend` varchar(15) DEFAULT NULL, 
    `hourend` varchar(6) DEFAULT NULL, 
    `tariff` varchar(16) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=latin1; 

    CREATE TABLE `rate_tariffs` (
    `id` int(3) NOT NULL AUTO_INCREMENT, 
    `name` varchar(25) DEFAULT NULL, 
    `group_id` int(3) DEFAULT NULL, 
    `price` varchar(10) DEFAULT NULL, 
    `currency` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 

感谢, 丹

回答

2

一对夫妇的意见和建议。这将使它工作。

在MySQL中使用本机类型可能更容易,特别是日期和时间。所以我建议将开始/结束时间更改为time字段。就像这样:

ALTER TABLE `scheduler` CHANGE `hourstart` `hourstart` TIME NULL DEFAULT NULL; 
ALTER TABLE `scheduler` CHANGE `hourend` `hourend` TIME NULL DEFAULT NULL; 

接下来,调度说,在时间上周四晚上10点开始(例如)和结束在上周四上午12点上午十二点在早上,所以结束时间在开始时间之前!所以我们需要将结束时间更改为大于开始时间(23:59:59)。开始和结束时间重叠一秒钟。让我们通过将结束时间减少1秒来使每个部分连接整齐(但不重叠)。在午夜前将任何无效时间设置为1秒。像这样:

UPDATE `scheduler` SET 
hourend = SUBTIME(hourend, '00:00:01'); 

UPDATE `scheduler` SET 
hourend = '23:59:59' 
WHERE hourend < '00:00:00'; 

接下来,我们将调整SQL查询以使用我们的本地MySQL时间字段。唯一需要改变的是底部的两条WHERE声明。我们希望它能检查小时是否在开始和结束之间:

SELECT scheduler.name, rate_tariffs.name, scheduler.id, rate_tariffs.id, CURTIME(), (EXTRACT(HOUR_MINUTE FROm CURTIME()) - REPLACE(hourstart,':',"")) as diff , daystart, hourstart,dayend,hourend from rate_tariffs 
INNER JOIN scheduler on rate_tariffs.name=tariff 
WHERE daystart = DATE_FORMAT(CURDATE(),'%W') 
    AND dayend = DATE_FORMAT(CURDATE(),'%W') 
    AND CURTIME() >= hourstart 
    AND CURTIME() <= hourend 
    AND group_id = 1; 
+0

到目前为止,它的作用就像魅力!我之前将它设置为00:00,因为当我将它设置为23:59时,我有一分钟它不输出任何结果:)无论如何,那不是我唯一的错误。非常感谢先生,您的帮助非常感谢! – Dan

+0

如果合并日期,这个SQL查询也可以工作吗?例如,星期一晚上和星期二上午不是星期一晚上,星期一晚上22:00开始,星期二05:59:59结束“星期二晚上”时间表? – Dan

+0

如果你确实想低着头合并天的路线,是的,你需要调整上述查询,以适应(特别是WHERE条件)。从MySQL的角度来看,现在的设置可能是最简单的解决方案。增加合并日的能力将是可能的,但可能会增加复杂性。 – Wireblue