sql查询between and 查询不到end当天,或者当start和end相等时查询为空

本文探讨了查询数据库中日期时遇到的问题,如查询截止至15号无当日数据和日期范围包含时间导致的空结果。提供了解决方案,即如何通过将时间戳转化为日期格式并调整查询条件,如使用Date(create_time) between #{start}

问题一:按时间查询截止至15号只能查到15号之前的数据而没有当天数据

问题二:当查询起止日期相同时,查询结果为空

这是因为当数据库中存储的date含有时间即2019-01-12 03:23:56 而你的查询只有2019-01-12时其自动补全为2019-01-12 00:00:00所以查不到,解决方法  

将含有时间的列转为只含日期的模式

Date(create_time)  between #{start} and #{end}

MySQL中以日期为查询条件的方法_zhousulian的博客-CSDN博客_sql如何把日期作为查询条件

<think>我们需要在SQLServer中进行查询并精确到毫秒。根据用户之前的回答,我们知道SQLServer中有多种日期间类型,其中DATETIMEDATETIME2可以存储毫秒级精度。不过,DATETIME的精度是3.33毫秒,而DATETIME2的精度可达100纳秒(即0.1微秒),因此更精确。在查询,我们需要注意以下几点:1.间常量字符串的格式必须正确,并且要包含毫秒部分。2.比较,由于精度问题,使用范围查询(>=<)可能比直接相等更安全。示例格式:对于DATETIME2类型,我们可以使用'YYYY-MM-DDHH:mm:ss.fff'(fff表示毫秒,最多7个f表示100纳秒,但通常用3位表示毫秒)。例如:'2023-07-1514:30:45.123'但是,用户要求精确到毫秒,所以我们用3位小数表示毫秒。以下是一些示例:1.精确查询某个间点(精确到毫秒):注意:由于实际存储的精度可能更高(如DATETIME2有更高精度),直接相等可能因为舍入问题而失败。因此,更推荐使用范围查询。2.范围查询(推荐):例如,查询从某个间点开始(包含)到另一个间点结束(不包含)的所有记录。3.另外,从引用[2]中我们知道,如果日期是字符串存储的,我们需要先转换为日期类型再比较,但这样会导致性能问题(无法使用索引)。所以,如果可能,应该将列改为日期间类型。现在,根据用户需求,给出精确到毫秒的查询示例。注意:在SQLServer中,GETDATE()函数返回当前日期间,精度与DATETIME类似(毫秒级,但DATETIME的精度是舍入到0.00333秒)。为了获得更高精度,应使用SYSDATETIME()(返回DATETIME2类型)。下面给出具体的查询示例:示例1:查询特定毫秒刻的记录(假设使用DATETIME2列)注意:由于精度问题,可能很难精确匹配,所以这里使用范围查询。示例2:查询最近5秒内且精确到毫秒的记录(使用SYSDATETIME())同,根据用户之前提供的引用,避免在WHERE子句中对列使用函数,以利用索引。因此,我们这样设计:假设我们有一个表,其中有一个DATETIME2类型的列[Timestamp]。1.精确查询某一毫秒刻(但实际上由于计算机间精度,几乎不会有完全相等,所以通常用范围):我们查询在'2023-07-1514:30:45.123'这一毫秒内的记录,可以这样写(范围为一个毫秒区间):SELECT*FROMYourTableWHERE[Timestamp]>='2023-07-1514:30:45.123'AND[Timestamp]< '2023-07-1514:30:45.124';2.查询最近5秒内的记录(精确到毫秒):我们可以使用DATEADD函数减去5秒,然后与当前间(高精度)比较。SELECT*FROMYourTableWHERE[Timestamp]>=DATEADD(SECOND,-5,SYSDATETIME())AND[Timestamp]<=SYSDATETIME();--注意:这里包含当前或者,更常见的写法是使用大于某个起始间点:SELECT*FROMYourTableWHERE[Timestamp]>DATEADD(SECOND,-5,SYSDATETIME());因为SYSDATETIME()返回的是当前刻(高精度),所以我们减去5秒得到5秒前的间点,然后查询大于该间点的记录。3.如果我们需要在条件中直接写入一个精确到毫秒的间字符串,格式必须正确。SQLServer可以识别多种格式,但最安全的是ISO8601格式(即'YYYY-MM-DDTHH:mi:ss.mmm')或者格分隔的'YYYY-MM-DDHH:mi:ss.mmm'。例如:'2023-07-1514:30:45.123'另外,注意引用[1]中提到的DATEDIFF函数,它可以计算两个间之间的差,但是它的结果是一个整数(例如按小计算,那么返回的是整数小数)。如果我们需要精确到毫秒的差值计算,则可以使用DATEDIFF(MILLISECOND,start_time,end_time)。但是,用户的问题主要是查询,而不是计算差值。下面我们总结并给出示例:</think> 在SQL Server中进行毫秒级精确查询,关键在于正确使用日期间格式数据类型。以下是详细方法示例: ### 一、精确到毫秒的查询方法 1. **使用`DATETIME2`类型**(推荐) ```sql -- 精确匹配毫秒间点 SELECT * FROM SensorData WHERE LogTime = '2023-07-15 14:30:45.1234567'; -- 最多支持7位小数(100纳秒精度) -- 范围查询(毫秒级) SELECT * FROM Transactions WHERE TransTime >= '2023-08-01 09:30:25.500' AND TransTime < '2023-08-01 09:30:25.700'; ``` 2. **`DATETIME`类型的毫秒处理** ```sql -- DATETIME精度为3.33毫秒,需使用特定格式 SELECT * FROM LegacyData WHERE CreateTime = '2023-07-15 14:30:45.123'; -- 只识别3位小数 ``` ### 二、获取当前间(毫秒级) ```sql -- 高精度当前间(返回DATETIME2) DECLARE @CurrentTime DATETIME2(7) = SYSDATETIME(); -- 在查询中使用 SELECT * FROM AuditLog WHERE EventTime > DATEADD(MILLISECOND, -500, SYSDATETIME()); ``` ### 三、毫秒级间过滤技巧 ```sql -- 查询特定毫秒范围内的数据 SELECT * FROM LabResults WHERE MeasurementTime BETWEEN '2023-08-01 14:25:30.123' AND '2023-08-01 14:25:30.999'; -- 提取毫秒部分进行分组 SELECT DATEPART(MILLISECOND, EventTime) AS Ms, COUNT(*) FROM HighFreqData GROUP BY DATEPART(MILLISECOND, EventTime); ``` ### 四、间计算(毫秒级) ```sql -- 增加500毫秒 UPDATE Events SET EndTime = DATEADD(MILLISECOND, 500, StartTime); -- 计算间差(毫秒) SELECT DATEDIFF(MILLISECOND, '2023-08-01 12:00:00.000', '2023-08-01 12:00:00.750'); ``` ### 五、性能优化建议 1. **避免隐式转换**: ```sql -- 错误示例(触发全表扫描) WHERE CONVERT(VARCHAR(23), LogTime, 121) = '2023-07-15 14:30:45.123' -- 正确写法 WHERE LogTime BETWEEN '2023-07-15 14:30:45.123' AND '2023-07-15 14:30:45.124' ``` 2. **对毫秒级字段创建索引**: ```sql CREATE NONCLUSTERED INDEX IX_LogTime_MS ON SensorData (LogTime) INCLUDE (SensorValue); ``` > ⚠️ 注意:`DATETIME2(3)`可存储毫秒精度,而`DATETIME2(7)`支持100纳秒精度。实际选择取决于精度需求与存储间的平衡[^2]。 --- ### 示例场景 **查找最近3.5秒内(3500毫秒)的日志**: ```sql DECLARE @CutoffTime DATETIME2(3) = DATEADD(MILLISECOND, -3500, SYSDATETIME()); SELECT * FROM ApplicationLog WHERE LogTime > @CutoffTime ORDER BY LogTime DESC; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值