Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >获取24小时内的记录

我试着根据时间和时间在我的桌子上找到价格。例如,这是我的桌子

代码语言:javascript
运行
AI代码解释
复制
+----+-----------------+------------+----------+---------+
| id | subscription_id | start_time | end_time | pricing |
+----+-----------------+------------+----------+---------+
|  1 |               1 | 22:00:00   | 21:59:59 |     1.5 |
|  2 |               2 | 05:30:00   | 16:29:00 |    0.75 |
|  3 |               2 | 16:30:00   | 18:59:59 |    0.50 |
|  4 |               2 | 19:00:00   | 05:29:59 |     1.5 |
+----+-----------------+------------+----------+---------+

现在,我必须找到从16:00开始,到20:00结束的第二代记述--我尝试了几种类似的方法,但都没有成功

代码语言:javascript
运行
AI代码解释
复制
SET @startTime := '17:30:00';
SET @endTime := '20:30:00';

SELECT *
FROM subscription_detail_pricing sdp
WHERE (
    (start_time < end_time AND TIME(@startTime) BETWEEN start_time AND end_time)
    OR
    (start_time > end_time AND TIME(@startTime) NOT BETWEEN end_time AND start_time)
    OR
    (start_time < end_time AND TIME(@endTime) BETWEEN start_time AND end_time) 
    OR
    (start_time > end_time AND TIME(@endTime) NOT BETWEEN end_time AND start_time)
) AND subscription_id = 2;

我找不到与此范围相对应的3条记录的查询方法

如果有人能给我些建议,我就会失去自我--

谢谢你阅读BenWa

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-17 07:38:49

这看起来像是一个典型的范围重叠查询。

如果可能的话,您可以为自己省去麻烦,将覆盖在"00:00:00"上的任何范围分割成两个单独的行,并使end_time成为独占的。

代码语言:javascript
运行
AI代码解释
复制
+----+-----------------+------------+----------+---------+
| id | subscription_id | start_time | end_time | pricing |
+----+-----------------+------------+----------+---------+
|  1 |               1 | 00:00:00   | 24:00:00 |     1.5 |
|  2 |               2 | 00:00:00   | 05:30:00 |     1.5 |
|  3 |               2 | 05:30:00   | 16:30:00 |    0.75 |
|  4 |               2 | 16:30:00   | 19:00:00 |    0.50 |
|  5 |               2 | 19:00:00   | 24:00:00 |     1.5 |
+----+-----------------+------------+----------+---------+

那么查询就变得简单多了。

代码语言:javascript
运行
AI代码解释
复制
SELECT *

  FROM subscription_detail_pricing

 WHERE start_time < "20:00:00"
   AND end_time > "16:00:00"

注意到,对于这个查询,我更喜欢独占比较,<>,因为您正在比较

  • start_time < "20:00:00" -比较start_time (包括)和输入范围"20:00:00" (独占)的末尾
  • end_time > "16:00:00" --将end_time (独占)与输入范围"16:00:00" (包括在内)的开头进行比较

只要被比较的值中至少有一个是排他性的,检查相等性( <=>= )对我来说就没有意义。

票数 1
EN

Stack Overflow用户

发布于 2019-07-17 07:54:51

若要检查时间范围中的重叠,请将se作为定义范围的开始和结束,并将bt作为我们要比较的范围的开始和终止,通常是这样的情况。

代码语言:javascript
运行
AI代码解释
复制
 b <= e AND t > s

就足以检查是否有重叠。但这只适用于b<ts<e。在所给出的场景中,在id=4 ( s,start_time)之前,使用e (end_time)的"wrap“行s( row )有一个折痕。

解决问题的一种方法是只存储start_time小于end_time的行。

我们可以通过将行id=4分成两行来实现这一点。

代码语言:javascript
运行
AI代码解释
复制
+----+-----------------+------------+----------+---------+
| id | subscription_id | start_time | end_time | pricing |
+----+-----------------+------------+----------+---------+
|  4 |               2 | 19:00:00   | 24:00:00 |     1.5 |
|  5 |               2 | 00:00:00   | 05:30:00 |     1.5 |
+----+-----------------+------------+----------+---------+

类似地,行id=1可以指定为

代码语言:javascript
运行
AI代码解释
复制
|  1 |               1 | 00:00:00   | 24:00:00 |     1.5 |

或者,如果有什么原因,我们需要22:00开始,我们可以把它分成两个范围

代码语言:javascript
运行
AI代码解释
复制
| 1a  |              1 | 22:00:00   | 24:00:00 |     1.5 |
| 1b  |              1 | 00:00:00   | 22:00:00 |     1.5 |

按照这一办法:

代码语言:javascript
运行
AI代码解释
复制
SET @bt := '16:00:00' ;
SET @tt := '20:00:00' ;

SELECT sdp.id
     , sdp.start_time
     , sdp.end_time
     , sdp.pricing
     , ( TIME(@bt) <= sdp.end_time AND TIME(@tt) > sdp.start_time ) AS overlap
  FROM sdp
 WHERE sdp.subscription_id = 2

返回:

代码语言:javascript
运行
AI代码解释
复制
  id  start_time  end_time   pricing  overlap  
----  ----------  ---------  -------  -------
   2  05:30:00.0  16:30:00.0    0.75        1
   3  16:30:00.0  19:00:00.0    0.50        1
   4  19:00:00.0  24:00:00.0    1.50        1
   5  00:00:00.0  05:30:00.0    1.50        0

向后/包装范围重叠

如果我们必须在end_time之前处理向后的范围重叠,那么我们似乎可以否定用于前向检查的相同条件,如果范围是向前的还是向后的,则添加检查。

代码语言:javascript
运行
AI代码解释
复制
SELECT sdp.id
     , sdp.start_time
     , sdp.end_time
     , sdp.pricing
     ,     (sdp.start_time < sdp.end_time AND ( TIME(@bt) <= sdp.end_time AND TIME(@tt) > sdp.start_time )) AS f_overlap
     , NOT (sdp.start_time < sdp.end_time AND ( TIME(@bt) <= sdp.end_time AND TIME(@tt) > sdp.start_time )) AS b_overlap
  FROM sdp
 WHERE sdp.subscription_id = 2 

中所示的行(将end_time稍微调整为范围之外的第一秒钟).

代码语言:javascript
运行
AI代码解释
复制
  id  start_time  end_time    pricing  f_overlap  b_overlap  
----  ----------  ----------  -------  ---------  ---------
   2  05:30:00.0  16:30:00.0  0.75             1          0
   3  16:30:00.0  19:00:00.0  0.50             1          0
   4  19:00:00.0  05:30:00.0  1.50             0          1

我们想要测试的条件包括在选择列表中,这使我们能够更好地看到正在发生的事情。我们还可以在同一行中返回@bt和@tt。

一旦我们测试了这些条件,我们就可以将它们转换为WHERE子句。

我们需要OR这两个条件,因为如果这两个条件都是真的,我们就会有重叠。

代码语言:javascript
运行
AI代码解释
复制
SELECT sdp.id
     , sdp.start_time
     , sdp.end_time
     , sdp.pricing
  FROM sdp
 WHERE sdp.subscription_id = 2
   AND (     (sdp.start_time < sdp.end_time AND ( TIME(@bt) <= sdp.end_time AND TIME(@tt) > sdp.start_time ))
      OR NOT (sdp.start_time < sdp.end_time AND ( TIME(@bt) <= sdp.end_time AND TIME(@tt) > sdp.start_time ))
       )

注:这些条件还没有经过充分的测试。请注意,这些条件要求@bt位于@et之前。如果我们想要处理那些“向后包装”,那么我们需要额外的条件检查和条件否定来处理这个问题。我们还希望确保测试范围的@bt为00:00和@et在24:00或之后。

用于安装:

代码语言:javascript
运行
AI代码解释
复制
CREATE TABLE sdp (id INT, subscription_id INT, start_time TIME(1), end_time TIME(1), pricing DECIMAL(8,2), PRIMARY KEY (id))
;
INSERT INTO sdp (id, subscription_id, start_time, end_time, pricing) VALUES 
 ( 1 , 1 , '22:00:00'   , '22:00:00' ,  1.50 )
,( 2 , 2 , '05:30:00'   , '16:30:00' ,  0.75 )
,( 3 , 2 , '16:30:00'   , '19:00:00' ,  0.50 )
,( 4 , 2 , '19:00:00'   , '05:30:00' ,  1.50 )
;

若要避免在范围中包装,请将所有范围设置为end_time后的start_time

代码语言:javascript
运行
AI代码解释
复制
DELETE FROM sdp WHERE id = 4; 
INSERT INTO sdp (id, subscription_id, start_time, end_time, pricing) VALUES 
 ( 4 , 2 , '19:00:00'   , '24:30:00' ,  1.50 )
,( 5 , 2 , '00:00:00'   , '05:30:00' ,  1.50 )
;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57078397

复制
相关文章
ASP.NET中使用Access数据库的困惑
这几天在做ASP.NET网站,后台数据库就用轻便的Access作数据库。我发现Access虽然相对MSSQL简单小巧,不用那么多的设置,但它也不轻松。如果你对它执行SQL语句的操作,万一表名或者字段名使用了它的关键字,那么就会抛出异常,而这些关键字在MSSQL中是很正常的。有时候这会让你苦不堪言。
SAP梦心
2022/05/10
1.6K0
ACCESS数据库基本使用
ACCESS是Office自带的数据库,使用起来非常方便。 相比,其它数据库来说,使用率较低,但是同MYSQL一样,免费。正因为如此,所以很多建站的程序员,还是会选择使用它。 部分代码: 1 <script type="text/javascript" src="js/daohang.js"></script> 2 <script> 3 var _hmt = _hmt || []; 4 (function () { 5 var hm
用户1112962
2018/07/04
5.2K0
使用VBA创建Access数据库
导读: 要处理数据量较大的数据,那么Excel会略显力不从心。特别是数据量大,且使用了Vlookup或大量的数组公式的工作簿,其效率可想而知。 从这方面讲,Excel更适合数据的展示,Access更适合于数据的存储,当然如果数据量超过4GB,那么你可能要选择SQLSERVER或其他大型数据库。针对小微型企业,一般情况下Access已经足够。 下面,介绍如何创建Access数据库,后续会介绍如何在Access数据库中建表,以及如何使用SQL语言管理数据库及查询数据,并将结果展示在Excel工作表中。 操作演示
企鹅号小编
2018/01/26
2.8K0
Python使用ADODB操作ACCESS数据库
第一步、分别创建ACCESS数据库文件MyDB.mdb和MyDB.accdb,在数据库中创建数据表“学生信息表”,包含学号、姓名、年龄、性别这几个字段。如图:
Python小屋屋主
2019/07/22
2.4K0
Access数据库
 数据库系统(DBS)是指拥有数据库技术支持的计算机系统  DBA:数据库管理员  DBS包括DB 和
青灯古酒
2023/10/16
3750
access数据库入门教程_数据库access基础教学
Jet Database Engine 用于与 Access (.mdb) 数据库中的数据配合使用,它支持 ANSI SQL-89 标准。但是,Access 数据库中的数据访问页是通过使用 ActiveX Data Objects (ADO) 和 Jet OLEDB 提供者连接至 Jet 的。ADO 和 OLEDB 总是使用 ANSI SQL-92 语法。因此,数据访问页必须使用 ANSI SQL-92 语法。这意味着绑定到同一查询的窗体和页可能返回不同的结果数据集。
全栈程序员站长
2022/09/27
4K0
access数据库入门教程_数据库access基础教学
access数据库设计报告-Access数据库表设计步骤
  大家好,上节介绍了Access数据库表中常见的概念,Access数据库中表的部分主要难点就在于表的设计,本节主要是串联一下Access数据库中表设计时的大概步骤,只先了解即可,具体的内容部分后面根据分解的知识点展开讲解。
宜轩
2022/12/26
3.7K0
Access数据库范式
大家好,本节主要介绍下数据库范式的相关知识。在介绍Access数据库设计步骤时,有提到过数据库范式的概念。
无言之月
2020/03/11
3.9K0
access数据库表的创建_access数据库sql语句大全
长度为255的文本varchar 长度为20的文本varchar(20) 日期时间datetime 数字byte或smallint或integer,或bit 自动编号:counter(1,1) 外健:constraint外健名 主键:primary key 小数:numeric 单精度:real 双精度:float 备注:memo 货币:currency Ole对象:image
全栈程序员站长
2022/11/08
4.3K0
使用Azure Application Insignhts监控ASP.NET Core应用程序
Application Insignhts是微软开发的一套监控程序。他可以对线上的应用程序进行全方位的监控,比如监控每秒的请求数,失败的请求,追踪异常,对每个请求进行监控,从http的耗时,到SQL查询的耗时,完完整整的被记录下来。当对程序进行优化跟排错时非常好使。它原来是visualstudio online的一个服务,现在合并进了Azure,作为Azure Monitor的一个组件。虽然合并进了Azure,但是Application Insignhts还是免费的。
MJ.Zhou
2020/07/16
8320
PowerDesigner生成Access数据库
1、打开PowerDesigner,设置PowerDesigner的当前数据库为Access; 2、在PowerDesigner中新建表结构(物理模型); 3、PowerDesigner菜单中:Database -> Generate Database...(快捷键Ctrl+G);      在弹出的对话框中,设置要生成数据库脚本的Directory和File name(文件名以dat做后缀)值;      在弹出的对话框 -> Format选项卡中,设置Encoding为简体中文GB2312;     
欢醉
2018/01/22
3.2K0
Access数据库表初识
大家好,本节主要是通过Excel和Access表的简单对比,来了解Access中表的一些基本概念(对Access有基础的可以跳过)。
无言之月
2019/10/13
5.1K0
Access数据库软件界面
大家好,本节简单介绍下Access数据库软件的界面,已经有一定基础的可以跳过这部分内容。
无言之月
2019/10/13
6.4K0
Python 连接Access数据库
   最后通过该链接:http://en.wikibooks.org/wiki/Python_Programming/Database_Programming
py3study
2020/01/08
6.1K0
pyodbc操作Access数据库
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u011054333/article/details/84863434
乐百川
2019/07/02
2.3K0
pyodbc操作Access数据库
安装添加access数据库
access版本目前已经更新出了很多,包括access2016,2010;2019,2021;
用户9693436
2022/04/24
5.3K0
vb连接access数据库
vb连接access数据库 1插入相应的包 Imports System.Data.OleDb 2声明连接参数 Dim OleDbConnection1 As OleDb.OleDbConnection Dim strConnect As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\db1.mdb" 3建立连接 OleDbConnection1 = New Sy
全栈程序员站长
2021/04/07
6.1K0
Access数据库相关知识
比如,公园到访者的数据表,可能包含的实体有:公园信息(主键是公园编号),到访者的信息(主键是到访者编号),到访者居住地的信息(主键是居住地编号)一共有2个实体,即3张表。
Sidchen
2020/08/07
3.9K0
Access数据库创建表
大家好,上节介绍了最常用的概念模型E-R模型,并通过模型将图书馆管理数据库分成不同的表格,本节简单演示下在Access数据库中创建对应的表。涉及的问题主要是字段的数据类型。
无言之月
2019/10/13
4.1K0
Access数据库基本对象
大家好,后期开始部分介绍Access数据内容,首先简单介绍下学习Access数据库的基本框架,主要包括六个常用的对象:表、查询、窗体、报表、宏、VBA模块。
无言之月
2019/10/13
4.7K0

相似问题

从ASP.Net应用程序LINQ到MS Access数据库?

10

使用VBA从Access应用程序使用ASP.NET VBA服务

14

使用Access数据库的ASP.NET

15

使用ASP.net和Access数据库从保护网站

22

使用ASP.NET连接到Access数据库

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档