MYSQL 同时比较时间和星期几
MYSQL comparing time and day of week simultaneously
我在 MYSQL 数据库中有以下 table。
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 8
和 9
获取行
请帮忙
问题是,STR_TO_DATE( 'Fri 07:16 AM', '%a %h:%i %p' )
导致 0000-00-00 07:16:00
,这发生在你所有的 "dates" 上。这意味着您丢失了星期几信息。
您可以通过将星期几替换为日期来解决此问题。例如。
您可以使用 2015-06-01
作为星期一,使用 2015-06-07
作为星期日。
但是整个table结构还有很多需要改进的地方。
- 将时间存储在
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)))
不再需要 CONCAT
和 STR_TO_DATE
这意味着您可以更好地使用索引。
除了前两点,您还可以将日期和时间存储在 DATETIME
字段中,使用具有正确星期几的日期。如果您将所有日期都放在同一周(例如从 2015-06-01 到 2015-06-07 的那一周),您可以像
一样进行查询
... WHERE input_date BETWEEN start_datetime AND end_datetime
我在 MYSQL 数据库中有以下 table。
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 8
和 9
请帮忙
问题是,STR_TO_DATE( 'Fri 07:16 AM', '%a %h:%i %p' )
导致 0000-00-00 07:16:00
,这发生在你所有的 "dates" 上。这意味着您丢失了星期几信息。
您可以通过将星期几替换为日期来解决此问题。例如。
您可以使用 2015-06-01
作为星期一,使用 2015-06-07
作为星期日。
但是整个table结构还有很多需要改进的地方。
- 将时间存储在
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)))
不再需要
CONCAT
和STR_TO_DATE
这意味着您可以更好地使用索引。除了前两点,您还可以将日期和时间存储在
一样进行查询DATETIME
字段中,使用具有正确星期几的日期。如果您将所有日期都放在同一周(例如从 2015-06-01 到 2015-06-07 的那一周),您可以像... WHERE input_date BETWEEN start_datetime AND end_datetime