【Sql Server】时间转换和查询时间范围查询不正确的原因

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 最近在做时间方法封装的时候发现了一个问题!如果sql语句输出的时间字段转为了字符串输出,那么在使用此字段作为时间范围筛选时发现无效了,没法过滤对应的时间范围内记录


作者:小5聊基础

简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑

编程原则:Write Less Do More


下面进行场景重现下

1、创建表

创建只有三个字段的表testTable,自增编号、全球唯一编号Guid、添加时间

create table testTableName
(
  id int identity(1,1) primary key,
  guidValue nvarchar(50),
  createTime datetime
)

image.gif

2、模拟一个月数据

1)可以写一个sql的循环语句按天模拟添加一个月的数据

2)定义一个整型变量,从0开始,循环30次

3)时间格式化,可以看我写的这篇文章《Sql Server日期格式化大全》

4)除了看时间格式化,还需要对时间进行加减《sql server 查询七天内的数据之时间条件格式化》

5)前一天设置,dateadd(day,-1,getdate())

declare @dayCount int
set @dayCount=0
while @dayCount<=30 begin
  insert into testTableName(guidValue,createTime)
  values(newid(),dateadd(day,-@dayCount,getdate()))
  set @dayCount+=1
end

image.gif

image.gif编辑

3、按时间查询

查询2022.12.15到2022.12.19号的记录,正确情况应该是返回5条记录

时间格式用了三个方式,小数点、斜杠、横杠,都可能正确查询出来

    • 正确返回
    select * from testTableName 
    where 1=1 and 
    --createTime>='2022.12.15 00:00:00' and createTime<='2022.12.19 23:59:59'
    createTime>='2022/12/15 00:00:00' and createTime<='2022/12/19 23:59:59'
    --createTime>='2022-12-15 00:00:00' and createTime<='2022-12-19 23:59:59'

    image.gif

    image.gif编辑

      • 错误查询方式 - 小数点格式

      image.gif编辑

        • 错误查询方式 - 斜杠格式

        image.gif编辑

          • 正确返回 - 横杠格式

          image.gif编辑

          select * from(
            select id,guidValue,convert(varchar(20),createTime,23) as createTime
            from testTableName
          ) a 
          where 1=1 and 
          --createTime>='2022.12.15 00:00:00' and createTime<='2022.12.19 23:59:59'
          --createTime>='2022/12/15 00:00:00' and createTime<='2022/12/19 23:59:59'
          createTime>='2022-12-15 00:00:00' and createTime<='2022-12-19 23:59:59'

          image.gif

            • 作为本身查询没问题

            image.gif编辑

            4、总结

            1)如果查询字段作为时间范围筛选,那么尽量不要把时间字段转为字符串格式

            2)如果时间格式转为字符串,那么不要在子查询外对字符串的时间字段进行时间范围筛选

            3)如果要作为时间范围筛选,那么使用yyyy-MM-dd格式进行筛选,否则查询无效


            相关实践学习
            使用SQL语句管理索引
            本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
            SQL Server on Linux入门教程
            SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
            相关文章
            |
            18天前
            |
            SQL 存储 人工智能
            Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
            Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
            86 7
            Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
            |
            25天前
            |
            SQL Java
            使用java在未知表字段情况下通过sql查询信息
            使用java在未知表字段情况下通过sql查询信息
            35 8
            |
            1月前
            |
            SQL 安全 PHP
            PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
            本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
            54 4
            |
            1月前
            |
            SQL 监控 关系型数据库
            SQL语句当前及历史信息查询-performance schema的使用
            本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
            |
            1月前
            |
            SQL 存储 缓存
            如何优化SQL查询性能?
            【10月更文挑战第28天】如何优化SQL查询性能?
            131 10
            |
            1月前
            |
            SQL 关系型数据库 MySQL
            |
            2月前
            |
            SQL 数据库 开发者
            功能发布-自定义SQL查询
            本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
            |
            2月前
            |
            SQL 移动开发 Oracle
            SQL语句实现查询连续六天数据的方法与技巧
            在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
            |
            2月前
            |
            SQL Java 数据库连接
            如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
            【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
            124 5
            |
            2月前
            |
            SQL 数据挖掘 数据库
            SQL查询每秒的数据:技巧、方法与性能优化
            id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言