问题
我想选择 10 月、11 月每天 06:45 到 07:15 之间的所有数据(行)。
信息
- 表中时间戳的格式为:'yyyy-mm-dd hh:mm:ss.000'
- 记录的每个数据都有一个开始时间戳列 ('starts_at') 和一个结束时间戳列 ('ends_at')
- 我使用 Convert_tz 将“gmt”转换为“us/eastern”。
使用的查询
select *
from
table1
where
NOT(
(hour(convert_tz(starts_at,'gmt','us/eastern')+minute(convert_tz(ends_at,'gmt','us/eastern'))) < 06.45 AND
(hour(convert_tz(ends_at,'gmt','us/eastern'))+minute(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
问题
通过此查询,我获取全天(从 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
以及响应(前几行的示例仅说明获取超出范围的时间戳的问题)
+------------------------+------------------------ --+
|开始|结束|
+------------------------+------------------------ --+
| 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
HOURS(starts_at) * 60 + MINUTES(starts_at) >= 405
And HOURS(ends_at) * 60 + MINUTES(ends_at) <= 435
order by
starts_at,ends_at
关于MySQL:选择特定时间之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34395721/