2013-01-10 228 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