-
2021-02-08 14:18:55
MySql查询时间段的方法未必人人都会,下面为您介绍两种MySql查询时间段的方法,供大家参考。
MySql的时间字段有date、time、datetime、timestamp等,往往我们在存储数据的时候将整个时间存在一个字段中,采用datetime类型;也可能采用将日期和时间分离,即一个字段存储date,一个字段存储时间time。无论怎么存储,在实际应用中,很可能会出现包含“时间段”类型的查询,比如一个访问记录数据库,需要统计每天的访问数量,这个每天就是一个时间段。下面介绍MySql查询时间段的两种常见方法,其他数据库也可以类似实现。
方法一:传统方式,即指定开始时间和结束时间,用"between”或者""来建立条件,比如查询2010年3月1日到2010年3月2日的数据条数,则可以使用
select count(*) from sometable where datetimecolumn>='2010-03-01 00:00:00' and datetimecolumn
但是,这种方法由于时间不是整数型数据,所以在比较的时候效率较低,所以如果数据量较大,可以将时间转换为整数型的UNIX时间戳,这就是方法二。
方法二:UNIX时间戳,每个时间对应了一个唯一的UNIX时间戳,该时间戳是从'1970-01-01 00:00:00' 为0开始计时,每秒增加1。MySql内置了传统时间和UNIX时间的互换函数,分别为:
UNIX_TIMESTAMP(datetime)
FROM_UNIXTIME(unixtime)
比如运行
SELECT UNIX_TIMESTAMP('2010-03-01 00:00:00')
返回1267372800
运行
SELECT FROM_UNIXTIME(1267372800)
返回'2010-03-01 00:00:00'
于是,我们可以将时间字段里的数据替换为整型的UNIX时间,这样,比较时间就成为整数比较了,建立索引后能大大提高效率。在查询的时候,需要把起点时间和结尾时间分别转换为UNIX时间再进行比较,如:
select count(*) from sometable where datetimecolumn>=UNIX_TIMESTAMP('2010-03-01 00:00:00') and datetimecolumn
也可以在调用程序中先转换为UNIX时间再传入MySql,总之这种方式有利于快速查询时间段,不过显示时间则需要再反转一次。
更多相关内容 -
MySQL查询某个时间段内的所有时间(存储过程实现)
2021-08-20 14:35:43我个人并不推荐在实际开发中使用存储过程,充满了各种的不方便,之所以写这东西,全在于学习,如果有高手看到我的内容有问题,可以随时指出或向我开炮。 创建存储过程: -- 创建存储过程 getTime -- param ...我个人并不推荐在实际开发中使用存储过程,充满了各种的不方便,之所以写这东西,全在于学习,如果有高手看到我的内容有问题,可以随时指出或向我开炮。
创建存储过程:
-- 创建存储过程 getTime -- param start_time 开始时间(输入参数 时间类型) -- param end_time 结束时间(输入参数 时间类型) CREATE PROCEDURE getTime(IN start_time TIMESTAMP, IN end_time TIMESTAMP) BEGIN -- 定义变量i 默认值为0 DECLARE i int DEFAULT 0; -- 定义变量 num 最大值 默认值为天数差(精度是天) -- 此处也可以用 TIMESTAMPDIFF 根据个人需求而定 -- 比如 精度是分钟 TIMESTAMPDIFF(MINUTE, start_time, end_time) DECLARE num int DEFAULT (SELECT DATEDIFF(end_time,start_time)); -- 创建一个临时表 用于存放数据 create temporary table time_table( -- id id int(64) PRIMARY KEY NOT NULL AUTO_INCREMENT, -- 时间 time datetime NOT NULL); -- 循环获取时间 WHILE i <= num DO -- 向临时表中放入数据 INSERT INTO time_table (`time`)VALUES(DATE_ADD(start_time,INTERVAL i DAY)); -- i 递增 set i=i+1; -- 结束循环 END WHILE; -- 返回结果 SELECT time FROM time_table; -- 删除临时表 DROP TABLE time_table; END;
调用:
call getTime('2021-08-01', '2021-08-19');
删除存储过程:
drop procedure if exists getTime;
-
分享:在存储过程中使用另一个存储过程返回的查询结果集的方法
2020-12-15 10:52:14如,存储过程sp_GetBorrowRecord @BeginTime,@EndTime 可以查询出某一时间范围(开始时间@BeginTime,结束时间@EndTime)内的所有借书记录。这个存储过程可以用于对借书记录的查询页面。 现在需要实现另一个功能... -
SQL server 利用存储过程查询任意字段的信息
2019-05-17 17:38:56创建如下数据表 CREATE TABLE EMP( EMPNO INT PRIMARY KEY, -- 员工编号 ENAME VARCHAR(10), -- 员工姓名 ...HIREDATE DATE, -- 入职时间 SAL FLOAT, -- 工资 COMM FLOAT, -- 奖金 DEPTNO INT,...创建如下数据表
CREATE TABLE EMP( EMPNO INT PRIMARY KEY, -- 员工编号 ENAME VARCHAR(10), -- 员工姓名 JOB VARCHAR(9), -- 员工工作 MGR INT, -- 员工直属领导编号 HIREDATE DATE, -- 入职时间 SAL FLOAT, -- 工资 COMM FLOAT, -- 奖金 DEPTNO INT, -- 所在部门 FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)); -- 关联dept表 -- ALTER TABLE EMP ADD FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO); INSERT INTO EMP VALUES(7369,'SMITH','职员',7566,'1980-12-17',800,NULL,20); INSERT INTO EMP VALUES(7499,'ALLEN','销售员',7698,'1981-02-20',1600,300,30); INSERT INTO EMP VALUES(7521,'WARD','销售员',7698,'1981-02-22',1250,500,30); INSERT INTO EMP VALUES(7566,'JONES','经理',7839,'1981-04-02',2975,NULL,20); INSERT INTO EMP VALUES(7654,'MARTIN','销售员',7698,'1981-09-28',1250,1400,30); INSERT INTO EMP VALUES(7698,'BLAKE','经理',7839,'1981-05-01',2850,NULL,30); INSERT INTO EMP VALUES(7782,'CLARK','经理',7839,'1981-06-09',2450,NULL,10); INSERT INTO EMP VALUES(7788,'SCOTT','职员',7566,'1987-07-03',3000,2000,20); INSERT INTO EMP VALUES(7839,'KING','董事长',NULL,'1981-11-17',5000,NULL,10); INSERT INTO EMP VALUES(7844,'TURNERS','销售员',7698,'1981-09-08',1500,50,30); INSERT INTO EMP VALUES(7876,'ADAMS','职员',7566,'1987-07-13',1100,NULL,20); INSERT INTO EMP VALUES(7900,'JAMES','职员',7698,'1981-12-03',1250,NULL,30); INSERT INTO EMP VALUES(7902,'FORD','销售员',7566,'1981-12-03',3000,NULL,20); INSERT INTO EMP VALUES(7934,'MILLER','职员',7782,'1981-01-23',1300,NULL,10);
现在想查询部门10中经理 和部门30中职员的编号和某个字段信息(如 员工的姓名)
我开始是这么写的if (exists (select * from sys.objects where name = 'search')) drop proc search GO CREATE PROC search( @some char(5)) AS BEGIN SELECT EMPNO ,@some FROM EMP WHERE DEPTNO = 10 AND JOB = '经理' OR DEPTNO = 20 AND JOB = '职员'; END GO exec search 'ENAME'
执行结果是这样的
后来我问了问带我的师傅 他说要这么改if (exists (select * from sys.objects where name = 'search')) drop proc search GO CREATE PROC search( @some char(5)) AS BEGIN exec ('SELECT EMPNO ,'+@some+ ' FROM EMP ' +'WHERE DEPTNO = 10 AND JOB = ''经理'' ' +'OR DEPTNO = 20 AND JOB = ''职员'''); END GO exec search 'ENAME'
执行结果如下
在编写查询任意字段的存储过程时,要注意将传入的变量“字段”化,即如果直接传入,在编译过程中,只会把该变量作为一个字符使用,而不会作为一个要查询字段名。改变方法是将查询语句及传入的变量以字符串的形式拼接,然后执行拼接后的查询语句。
还有位大佬对比各种方法做了下分析,有兴趣的可以看一下
https://www.cnblogs.com/wy123/p/5958047.html -
GBase 8s存储过程中获取当前时间
2021-02-24 13:43:56但在存储过程中,如果我们想要获取某一段语句的执行时间长度,需要使用两个变量获取当时时间,如下: drop procedure if exists proc_datetime; create procedure proc_datetime() returns varchar(255); define ...GBase 8s数据库中获取当前时间,可以使用current year to second这样方式。
但在存储过程中,如果我们想要获取某一段语句的执行时间长度,需要使用两个变量获取当时时间,如下:drop procedure if exists proc_datetime; create procedure proc_datetime() returns varchar(255); define dt1 datetime year to second; define dt2 datetime year to second; let dt1 = current year to second; system "sleep 5"; let dt2 = current year to second; return "dt1: " || dt1 || " dt2: " || dt2; end procedure;
执行该过程,我们发现返回的两个时间dt1和dt2均一样:
call proc_datetime(); (expression) dt1: 2021-02-24 01:31:13 dt2: 2021-02-24 01:31:13 1 row(s) retrieved.
原因是:存储过程内的时间点均为存储过程开始执行的时刻。
那么,我们在存储过程中获取变化的时间呢?其实在sysmaster:sysshmvals表中有个系统时间戳的字段sh_curtime,我们可以通过其获取到当前时间。如下:drop procedure if exists proc_datetime2; create procedure proc_datetime2() returns varchar(255); define dt1 datetime year to second; define dt2 datetime year to second; select DBINFO('utc_to_datetime',sh_curtime) into dt1 from sysmaster:sysshmvals; system "sleep 5"; select DBINFO('utc_to_datetime',sh_curtime) into dt2 from sysmaster:sysshmvals; return "dt1: " || dt1 || " dt2: " || dt2; end procedure;
执行该过程,得到正确的结果:
call proc_datetime2(); (expression) dt1: 2021-02-24 01:45:19 dt2: 2021-02-24 01:45:24 1 row(s) retrieved.
对于dbinfo函数的介绍,可以参考之前的介绍。
如果我们经常需要用到获取当时时间的功能,可以把其包装成个存储过程。
create procedure getsysdate() returns datetime year to second; define tmpdate datetime year to second; select DBINFO('utc_to_datetime',sh_curtime) into tmpdate from sysmaster:sysshmvals; return tmpdate; end procedure;
调用时,改成
drop procedure if exists proc_datetime3; create procedure proc_datetime3() returns varchar(255); define dt1 datetime year to second; define dt2 datetime year to second; let dt1 = getsysdate(); system "sleep 5"; let dt2 = getsysdate(); return "dt1: " || dt1 || " dt2: " || dt2; end procedure;
-
mysql进阶(十九)SQL语句如何精准查找某一时间段的数据
2021-01-25 21:05:56SQL语句如何精准查找某一时间段的数据在项目开发过程中,自己需要查询出一定时间段内的交易。故需要在sql查询语句中加入日期时间要素,sql语句如何实现?SELECT*FROMlmapp.lm_billwheretx_timeBetween'2015-12-20'And... -
SQL Server实现某书店图书进货、销售管理系统
2018-07-04 13:43:43(5)创建存储过程查询某段时间内各种图书的进货和销售情况; (6)创建视图查询各类图书的库存总数; (7)创建触发器当图书入库时自动修改相应图书的总量和存放仓库中该图书的数量; (8)要求一单可以... -
mysql获取指定时间段中所有日期或月份(不设存储过程,不加表)
2020-06-19 16:56:56最近需要用mysql获取一个时间段中的所有月份,网上查都是要设置存储过程或者加一个日期表的,不满足我的需求。翻墙找资料加上自己试验,如下代码分享给大家 正文 1:获取时间段所有月份 select DATE_FORMAT(date_add... -
MYSQL按时间段分组查询当天小时内数据
2018-12-14 18:15:50我这边得时间用的是时间戳,如果是有格式的请用DATE_FORMAT()函数。 思路就是将今天要查询的时间戳格式化成时。然后当依据查询。这样的结果是,24小时的数据都有了。最多24条。这时候你想要两个小时内的条数的话... -
mysql遍历一段时间内的所有日期、月份
2020-08-27 16:22:46遍历一段时间内的所有月份 SELECT DISTINCT date_format( DATE_ADD( '2019-06-30' , INTERVAL id MONTH ), '%Y-%m' ) AS `TIME` FROM bbkb_busticket.time WHERE DATE_ADD( '2019-06-30' , ... -
Sql Server 查询指定范围(一周,一月,本周,本月等)内的数据,及产生一段时间内所有日期
2019-06-28 10:57:23--生成一段时间内的日期(一年内) SELECT CONVERT(NVARCHAR(10), DATEADD(DAY,number,DATEADD(YEAR,-1,GETDATE())),120) AS GroupDate FROM master..spt_values WHERE type = 'p' AND number (DAY,DATEADD(YEAR,-1,... -
查询某段时间内过生日的员工名单的SQL语句
2008-11-28 18:35:00首先讲讲要用到的两个数据库函数...interval表示时间的间隔可以是yy(表示年),mm(表示月),dd(表示日),qq(表示季度),ww(表示周);number表示间隔的数值,正数表示日期数据date的未来,负数表示日期数据大特 -
mysql查询一个时间段每天数据数量,没有显示为0
2020-04-17 11:24:54按照时间段来查询显示该时间段内每一天的数据量,如果某一天没有数据,显示数据量为0. 按照正常思路直接使用GROUP BY分组查询即可,运行如下sql SELECT COUNT(1) as `count`,date_format(u.createtime,'%Y-%m-%d'... -
oracle查询出一段时间内每月有几周和每周一开始到周日的日期
2016-06-21 20:50:50前言:一般做数据统计写存储过程的时候相信好多朋友都对日期进行过处理,这是我当时对数据进行处理,做统计用的。当时做要求必须显示日期。尤其是对周进行统计的时候,特别恶心,于是把我以前对日期操作的存储过程中... -
SQL Server数据库存储过程——以自定义存储过程为例
2019-05-14 22:04:38SQL Server数据库存储过程——以自定义存储过程为例 1、什么是数据库存储过程 存储过程就是预编译SQL语句的集合,这些语句存储在一个名称下并作为一个单元处理。存储过程代替了传统的逐条执行SQL语句的方式 SQL... -
MySQL 05 存储过程
2022-04-24 22:11:183.2声明语句分隔符3.3过程体的标识3.4存储过程参数设置3.5创建、调用存储过程示例四、存储过程中的变量五、MySQL变量六、用户变量在存储过程间...查看数据库中已创建的存储过程查看hosptal数据库中创建的存储过程十、查 -
SqlServer 查询一段时间,没有数据自动补充0
2019-02-13 10:41:07业务需求:查询一段时间的数据、前端生成折线或柱状图。时间不限、有可能是一个季度的,也有可能是一个月的。需要将每一天的数据都显示。数据是从定时任务中抽取回来的。 问题:假如查询时间为一个月、这一个月假..... -
存储过程,使用游标,详细过程及详解
2018-12-23 17:08:12根据理解,自己编写了一个存储过程,先查出一些数据存入游标中,然后再把查出来的值和参数值插入到表中 ------------------------查询余额表的存储过程 create or replace procedure Op_Truacc_SaveTrialbalanc... -
存储过程和函数的操作
2021-11-22 20:40:24存储过程和函数就是事先经过编译并存储在数据库中的一段SQL语句集合。触发器的执行不是由程序调用,也不是由手动启动,而是由事件来触发、激活从而实现执行。而存储过程和函数的执行,则需要手动调用存储过程和函数... -
Oracle存储过程详解(一)
2016-04-20 09:38:49存储过程创建语法: create [or replace] procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param... -
day29 | 黑马程序员Java全程笔记 | 第二阶段MySQL高级事务-索引-视图-触发器-存储过程
2022-04-03 12:32:35目录 01.反馈 02.回顾 03.并发访问MySQL-问题概述 并发访问的问题 ...04.并发访问MySQL-问题演示 ...05.并发访问MySQL-read-committed解决...10.存储引擎和索引数据结构 11.索引结构-BTree结构 BTREE 结构 12.B+Tree -
图解MySql命令行创建存储过程
2018-03-29 16:15:29创建第一个存储过程;事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码;调用一下,成功了;创建一个带输出参数的存储过程,返回book表的记录数;创建成功;如下的调用... -
数据库存储过程
2017-12-02 19:07:18SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。... -
sqlserver 存储过程 临时表 时间计算 循环 问题
2015-02-02 22:10:01结果存储过程不会,各种系统函数也不会用。客户那边还没网络。着实憋气了。 下面是查到的一些东西 一 、临时表的使用 表名前使用一个#号,临时表是局部的,使用两个#号,临时表是全局的,在断开连接后sql会自动删除... -
mysql 求时间段平均值
2019-08-11 21:46:16考虑下面的需求,在一段时间内,间隔一段时间,取一个平均值,把所有的平均值取出来,怎么办?思路:在存储过程中,拼接sql语句。根据起始时间和结束时间,while循环每次加一段时间。DROP PROCEDURE IF EXISTS `get_... -
SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法
2016-12-22 16:57:28最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种... -
[SQL]查询某一个字段在某一段时期数据库中使用到的记录
2014-10-21 14:02:37SQL查询数据库中某一字段 -
MySQL存储过程中的3种循环
2018-01-09 19:30:00MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法 在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准...