MySQL:选择特定时间之间的数据

标签 mysql date

问题

我想选择 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/

相关文章:

mysql - 无法通过套接字 '/var/lib/mysql/mysql.sock' 连接到 MySQL 服务器

javascript - 日期格式

仅基于月和年的 SQL Server 日期比较

java - 使用具有 long 值的 java.sql.Date 构造函数

c# - 日期时间转换 添加 5 小时

php - 在 PHP 中返回 JSON 消息

mysql - XAMPP中配置tomcat出错

php - php.ini 中设置的默认欧洲时区,但 date_default_timezone_get() 返回 'UTC'

mysql - 我是否要在现有列中插入或更新最大数量?

c# - 异常: There is already an open DataReader associated with this Connection which must be closed first