MYSQL同时比较时间和星期几

时间:2015-06-05 08:59:03

标签: php mysql datetime-format

我在MYSQL数据库中有以下表格。

CREATE TABLE IF NOT EXISTS `wp_my_default_settings` (
  `ds_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `whichday` varchar(10) NOT NULL,
  `tillday` varchar(10) NOT NULL,
  `start_time` varchar(10) NOT NULL,
  `end_time` varchar(10) NOT NULL,
  `max_no_msg` int(11) NOT NULL,
  `created_date` datetime NOT NULL,
  PRIMARY KEY (`ds_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `wp_my_default_settings`
--

INSERT INTO `wp_my_default_settings` (`ds_id`, `user_id`, `whichday`,         `tillday`, `start_time`, `end_time`, `max_no_msg`, `created_date`) VALUES
(10, 11, 'Thu', 'Fri', '11:57 PM', '01:54 PM', 22, '2015-06-05 13:56:04'),
(9, 11, 'Thu', 'Thu', '12:06 AM', '02:46 PM', 20, '2015-06-05 13:56:04'),
(8, 11, 'Wed', 'Wed', '05:11 AM', '12:47 PM', 34, '2015-06-05 13:56:04'),
(7, 11, 'Tue', 'Tue', '10:02 AM', '05:14 PM', 50, '2015-06-05 13:56:04'),
(6, 11, 'Sun', 'Sun', '06:30 PM', '06:30 PM', 40, '2015-06-05 13:56:04');

我的时间指定为星期五上午7:16

我想制定一个查询,选择具有'Fri 7:16' BETWEEN CONCAT( CONCAT( whichday, ' ' ) , start_time ) AND CONCAT( CONCAT( tillday, ' ' ) , end_time )的行  我的问题是

   SELECT `ds_id` , `whichday` , `start_time` , `tillday` ,    
`end_time` , STR_TO_DATE( CONCAT( CONCAT( whichday, ' ' ) , start_time ) , '%a %h:%i %p' ) AS 'Start', 
    STR_TO_DATE( CONCAT( CONCAT( tillday, ' ' ) , end_time ) , '%a %h:%i %p' ) AS 'End', 
    STR_TO_DATE( 'Fri 07:16 AM', '%a %h:%i %p' ) AS 'Current' 
    FROM `wp_my_default_settings`
    WHERE `user_id` = '11'
    AND (
        STR_TO_DATE( 'Fri 07:16 AM', '%a %h:%i %p' )
        BETWEEN STR_TO_DATE( CONCAT( CONCAT( whichday, ' ' ) , start_time ) , '%a %h:%i %p' )
        AND STR_TO_DATE( CONCAT( CONCAT( tillday, ' ' ) , end_time ) , '%a %h:%i %p'         )
    )    
    AND `max_no_msg` >= (
    SELECT COUNT( `offer_id` )
    FROM `wp_user_offers_by_adv`
    WHERE `offer_user_id` = '11' )

我没有获得ds_id=10行,而是获得了ds_id 89

的行

请帮忙

1 个答案:

答案 0 :(得分:1)

问题是,STR_TO_DATE( 'Fri 07:16 AM', '%a %h:%i %p' )导致0000-00-00 07:16:00,这会发生在您的所有“日期”中。这意味着您将丢失星期几的信息。

您可以通过将日期替换为日期来解决此问题。例如。 您可以将2015-06-01用作星期一,将2015-06-07用作星期日。

但是整个表结构还有很多需要改进的地方。

  • 将时间存储在TIME字段中 这为每个字段节省了大约6个字节(或66%),并且可以使查询更容易。
  • 将星期几作为数字(1到7)存储在TINYINT字段中。
    这样可以节省大约3个字节(或75%),并使您可以进行如下查询:

    ... WHERE (whichday < input_day 
                OR whichday = input_day AND start_time <= input_time))
              AND
              (tillday > input_day 
                OR tillday = input_day AND end_time >= input_time)))
    

    不再需要CONCATSTR_TO_DATE,这意味着您可以更好地使用索引。

  • 替代前两点,您可以使用具有正确星期几的日期将日期和时间存储在DATETIME字段中。如果您将所有日期都放在同一周(例如2015-06-01至2015-06-07的那一周),您可以像

    一样进行查询
    ... WHERE input_date BETWEEN start_datetime AND end_datetime