MySQL:选择特定时间之间的数据 问题:
我想选择10月、11月每天06:45到07:15之间的所有数据(行) 信息MySQL:选择特定时间之间的数据 问题:,mysql,date,Mysql,Date,我想选择10月、11月每天06:45到07:15之间的所有数据(行) 信息 表中的时间戳格式为:“yyyy-mm-dd hh:mm:ss.000” 记录的每个数据都有一个开始时间戳列(“开始时间”)和一个结束时间戳列(“结束时间”) 我使用convert_tz将“gmt”转换为“us/eastern” 使用的查询 选择* 从…起 表1 哪里 不是( (小时(转换时间(从格林尼治标准时间开始,'us/eastern')+分钟(转换时间(从格林尼治标准时间结束,'us/eastern')))“2
- 表中的时间戳格式为:“yyyy-mm-dd hh:mm:ss.000”
- 记录的每个数据都有一个开始时间戳列(“开始时间”)和一个结束时间戳列(“结束时间”)
- 我使用convert_tz将“gmt”转换为“us/eastern”
选择*
从…起
表1
哪里
不是(
(小时(转换时间(从格林尼治标准时间开始,'us/eastern')+分钟(转换时间(从格林尼治标准时间结束,'us/eastern')))<06.45和
(小时(换算为“格林尼治标准时间”、“美国/东部时间”结束)+分钟(换算为“格林尼治标准时间”、“美国/东部时间”结束)>07.15
)及
转换时间(从“格林尼治标准时间”、“美国/东部时间”开始)>“2015-10-01 00:00:00.000”和
转换时间(结束于格林尼治标准时间、美国/东部时间)<'2015-12-01 00:00:00.000'
订单开始于,结束于
问题
通过这个查询,我得到的是一整天(从00到23小时)的数据,而不仅仅是我想要的时间段
编辑1:根据@GordonLinoff的答案
质疑,
select
convert_tz(starts_at,'gmt','us/pacific') as Starts,
convert_tz(ends_at,'gmt','us/pacific') as Ends
from
table1
where
(100 * hour(convert_tz(starts_at,'gmt','us/pacific'))+minute(convert_tz(starts_at,'gmt','us/pacific'))) >= 0645 AND
(100 * hour(convert_tz(ends_at,'gmt','us/pacific'))+minute(convert_tz(ends_at,'gmt','us/pacific'))) <= 0715 AND
convert_tz(starts_at,'gmt','us/pacific') > '2015-12-01 00:00:00.000' AND
convert_tz(ends_at,'gmt','us/pacific') < '2015-12-20 00:00:00.000'
order by starts_at, ends_at
选择
将_tz(开始于,'gmt','us/pacific')转换为开始,
将_tz(在'gmt'和'us/pacific'结束)转换为结束
从…起
表1
哪里
(100*小时(换算时间(从格林尼治标准时间开始,'us/pacific'))+分钟(换算时间(从格林尼治标准时间开始,'us/pacific'))>=0645和
(100*小时(换算为“格林尼治标准时间”、“美国/太平洋地区”)+分钟(换算为“格林尼治标准时间”、“美国/太平洋地区”))“2015-12-01 00:00:00.000”和
转换时间(结束于格林尼治标准时间、美国/太平洋地区)<'2015-12-20 00:00:00.000'
订单开始于,结束于
和响应(前几行的示例,仅说明获取超出范围的时间戳的问题)
+-------------------------+-------------------------+
|开始|结束|
+-------------------------+-------------------------+
| 2015-12-01 06:45:03.549 | 2015-12-01 06:45:35.003 |
| 2015-12-01 06:45:35.003 | 2015-12-01 06:47:00.203 |
| 2015-12-01 06:47:00.203 | 2015-12-01 06:54:11.615 |
| 2015-12-01 06:47:00.780 | 2015-12-01 06:47:40.860 |
| 2015-12-01 06:47:40.860 | 2015-12-01 06:48:52.103 |
| 2015-12-01 06:48:52.103 | 2015-12-01 06:51:33.925 |
| 2015-12-01 06:51:33.925 | 2015-12-01 06:52:34.543 |
| 2015-12-01 06:52:34.543 | 2015-12-01 07:00:00.000 |
| 2015-12-01 06:54:11.615 | 2015-12-01 06:59:59.074 |
| 2015-12-01 06:59:59.074 | 2015-12-01 07:14:59.074 |
| 2015-12-01 06:59:59.158 | 2015-12-01 07:14:59.158 |
| 2015-12-01 06:59:59.388 | 2015-12-01 07:14:59.388 |
| 2015-12-01 06:59:59.393 | 2015-12-01 07:14:59.393 |
| 2015-12-01 06:59:59.513 | 2015-12-01 07:14:59.513 |
| 2015-12-01 06:59:59.708 | 2015-12-01 07:14:59.708 |
| 2015-12-01 07:00:00.000 | 2015-12-01 07:15:00.000 |
| 2015-12-01 07:00:00.000 | 2015-12-01 07:15:00.000 |
| 2015-12-01 07:00:00.000 | 2015-12-01 07:15:00.000 |
| 2015-12-01 07:00:00.000 | 2015-12-01 07:15:00.000 |
| 2015-12-01 07:00:01.912 | 2015-12-01 07:14:59.471 |
| 2015-12-01 21:59:59.158 | 2015-12-02 00:59:59.158 |
| 2015-12-01 21:59:59.388 | 2015-12-02 06:59:59.388 |
| 2015-12-01 21:59:59.513 | 2015-12-02 06:59:59.513 |
| 2015-12-01 22:00:00.000 | 2015-12-02 01:00:00.000 |
| 2015-12-01 22:00:00.000 | 2015-12-02 01:00:00.000 |
| 2015-12-01 22:43:26.458 | 2015-12-02 05:13:23.365 |
| 2015-12-01 23:15:05.493 | 2015-12-02 05:08:38.585 |
| 2015-12-01 23:18:10.110 | 2015-12-02 05:09:29.648 |
| 2015-12-01 23:31:41.896 | 2015-12-02 00:10:16.796 |
| 2015-12-01 23:45:37.852 | 2015-12-02 00:19:22.301 |
| 2015-12-01 23:53:48.851 | 2015-12-02 00:17:20.538 |
| 2015-12-02 06:51:11.221 | 2015-12-02 06:51:16.456 |
| 2015-12-02 06:51:16.456 | 2015-12-02 07:01:19.435 |
只有2100到0045范围内的时间戳在整个数据集中不断重复。尝试以下方法:
select *
from
table1
where
NOT(
(time(convert_tz(starts_at,'gmt','us/eastern'))) < '06:45' AND
(time(convert_tz(ends_at,'gmt','us/eastern'))) > '07:15'
) AND
convert_tz(starts_at,'gmt','us/eastern') > '2015-10-01 00:00:00.000' AND
convert_tz(ends_at,'gmt','us/eastern') < '2015-12-01 00:00:00.000'
order by starts_at, ends_at
选择*
从…起
表1
哪里
不是(
(时间(转换时间(从“格林尼治标准时间”、“美国/东部时间”开始)<'06:45'和
(时间(转换时间(结束于格林尼治标准时间,'us/eastern'))>'07:15'
)及
转换时间(从“格林尼治标准时间”、“美国/东部时间”开始)>“2015-10-01 00:00:00.000”和
转换时间(结束于格林尼治标准时间、美国/东部时间)<'2015-12-01 00:00:00.000'
订单开始于,结束于
小时
+分钟
将是介于0(午夜)和82(23+59)之间的值。此外,值不能同时是<6.45
和>7.15
有几种方法可以满足您的需求。以下是您方法的要点:
(100 * hour(convert_tz(starts_at,'gmt','us/eastern')+minute(convert_tz(ends_at,'gmt','us/eastern'))) >= 0645 AND
(100 * hour(convert_tz(ends_at,'gmt','us/eastern'))+minute(convert_tz(ends_at,'gmt','us/eastern'))) <= 0715
) AND
(100*小时(转换时间(从格林威治标准时间开始,'us/eastern')+分钟(转换时间(从格林威治标准时间结束,'us/eastern'))>=0645和
(100*hour(convert_-tz(结束于,'gmt','us/eastern'))+min(convert_-tz(结束于,'gmt','us/eastern'))提取时间并将其转换为分钟
SELECT
*
FROM
table1
WHERE
HOURS(starts_at) * 60 + MINUTES(starts_at) >= 405
And HOURS(ends_at) * 60 + MINUTES(ends_at) <= 435
order by
starts_at,ends_at
选择
*
从…起
表1
哪里
小时(开始时间)*60+分钟(开始时间)>=405
和小时(结束时间)*60+分钟(结束时间)谢谢!但使用“时间”功能对我不起作用。它再次返回从0000小时起的所有值。谢谢!您的信息有效,但它也给我提供了超出我选择范围的时间戳。注意:只有从2100小时到0030小时(第二天)的时间戳继续超出范围。否则,我只会得到0645到0715之间的时间戳。@shriramks…您应该用示例数据和所需结果编辑您的问题。我删除了以前的注释,因为我让查询正常工作了!谢谢!做了一个更改:(小时(转换时间(从,'gmt','us/central'))*60分钟(转换时间)(从“格林尼治标准时间”、“美国/中部”开始)
SELECT
*
FROM
table1
WHERE
HOURS(starts_at) * 60 + MINUTES(starts_at) >= 405
And HOURS(ends_at) * 60 + MINUTES(ends_at) <= 435
order by
starts_at,ends_at