使用SQL计算宝宝每次吃奶的时间间隔
需求:媳妇儿最近担心宝宝的吃奶时间不够规律,网上说是正常平均3小时喂奶一次,让我记录下每次的吃奶时间,分析下实际是否偏差很大,好在下次去医院复查时反馈给医生。
此外,还要注意有时候哭闹要吃奶,而实际只吃了两口便不吃了。这种情况要特殊标记下,如果不算这种情况的话,分析看是否正常。
环境:Oracle 11.2.0.4
1.记录每次吃奶时间
我在自己的Oracle测试环境中创建了一张表t_baby,用于实现记录宝宝每次的吃奶时间:
test@DEMO> desc t_baby
Name Null? Type
----------------------------------------- -------- ------------
ID NOT NULL NUMBER
FEED_TIME NOT NULL DATE
LABEL VARCHAR2(1)
注意:这里的LABEL字段就是用于标志吃奶量的。
默认值设置为'N',代表吃奶量正常;如果吃奶量很少,则可将对应记录的LABEL字段值手工更新为'L';如果吃奶量非常多,超过正常值,则更新为'M'。
由于每次吃奶都要人为的插入一条数据,为了简化这个运维操作,将插入语句保存到文件i.sql中,内容如下:
test@DEMO> get i
1 PROMPT Please input your feed_time(mmdd hh24:mi). eg:1213 08:00
2* insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh24:mi'))
test@DEMO>
这样每次执行插入就可以方便的直接@i调用插入,比如刚刚媳妇儿告知我本次吃奶时间是13:16,那直接调用插入即可:
test@DEMO> @i
Please input your feed_time(mmdd hh24:mi). eg:1213 08:00
Enter value for feed_time: 1213 13:16
old 1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh24:mi'))
new 1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('1213 08:00','mmdd hh24:mi'))
1 row created.
test@DEMO> commit;
Commit complete.
确认刚刚插入的数据无误后,一定要记得提交事物。我之所以没有将commit写到脚本中,就是为了当发现数据输入有误,方便直接rollback回滚。
现在我们来看一下现有的数据,详细记录了每一次的吃奶时间:
test@DEMO> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
test@DEMO> select * from t_baby;
ID FEED_TIME LABEL
---------- ------------------- -----
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N
8 2019-12-13 09:01:00 N
9 2019-12-13 10:40:00 L
15 2019-12-13 11:50:00 N
16 2019-12-13 13:16:00 N
6 rows selected.
可以看到ID=9这条记录的LABEL='L',也就是说这次吃奶量非常少。
2.计算吃奶时间间隔
也许有人禁不住会问,你这么简单的需求还把它弄到Oracle数据库里,还用SQL计算实现。什么?你说你还要用到Oracle分析函数?
其实不必太较真了,适合自己的才是最好的,我就是喜欢敲sqlplus不喜欢用Excel等工具,还能复习下分析函数,何乐而不为呢。
废话不多说,来看如何用分析函数显示上次喂奶时间L_TIME:
select t.*, lag(feed_time) over(order by id) l_time from t_baby t;
test@DEMO> select t.*, lag(feed_time) over(order by id) l_time from t_baby t;
ID FEED_TIME L L_TIME
---------- ------------------- - -------------------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 2019-12-13 02:49:00
8 2019-12-13 09:01:00 N 2019-12-13 04:58:00
9 2019-12-13 10:40:00 L 2019-12-13 09:01:00
15 2019-12-13 11:50:00 N 2019-12-13 10:40:00
16 2019-12-13 13:16:00 N 2019-12-13 11:50:00
6 rows selected.
然后直接查询计算下喂奶间隔即可,以分钟为单位:
select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)"
from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t);
test@DEMO> select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t);
ID FEED_TIME L LAG(min)
---------- ------------------- - ----------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 129
8 2019-12-13 09:01:00 N 243
9 2019-12-13 10:40:00 L 99
15 2019-12-13 11:50:00 N 70
16 2019-12-13 13:16:00 N 86
6 rows selected.
媳妇儿主要担心是喂奶间隔太短,会不会撑到宝宝,那如果说我们假定间隔在2h以上都是正常的话,那么对应的也就是LAG(min)>120分钟以上的为正常。
从目前已有的数据来看,的确异常次数比较多。
而我们之前说到存在喂奶量极少的情况,如果将这种情况排除在外呢?再重新计算:
select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)"
from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t where label <> 'L');
test@DEMO> select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t where label <> 'L');
ID FEED_TIME L LAG(min)
---------- ------------------- - ----------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 129
8 2019-12-13 09:01:00 N 243
15 2019-12-13 11:50:00 N 169
16 2019-12-13 13:16:00 N 86
这下可以看到数据趋于正常,只有一次喂奶间隔在120分钟以下了。当然目前数据还比较少,后续数据多了才可以更准确的反映出异常的比例。
因为会经常查询到这个间隔时间。将这个两个语句分别保存为v1.sql和v2.sql,方便后续使用。
test@DEMO> l
1* select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t)
test@DEMO> save v1 rep
Wrote file v1.sql
test@DEMO> l
1* select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t where label <> 'L')
test@DEMO> save v2 rep
Wrote file v2.sql
test@DEMO> @v1
ID FEED_TIME L LAG(min)
---------- ------------------- - ----------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 129
8 2019-12-13 09:01:00 N 243
9 2019-12-13 10:40:00 L 99
15 2019-12-13 11:50:00 N 70
16 2019-12-13 13:16:00 N 86
6 rows selected.
test@DEMO> @v2
ID FEED_TIME L LAG(min)
---------- ------------------- - ----------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 129
8 2019-12-13 09:01:00 N 243
15 2019-12-13 11:50:00 N 169
16 2019-12-13 13:16:00 N 86
test@DEMO>
最后总结下,实际以后每次记录喂奶时间直接@i输入具体时间,每次查喂奶间隔就根据实际需求看@v1或者@v2就ok,确认无误后提交更改,再实际熟悉下整个流程:
--1.插入喂奶时间:
test@DEMO> @i
Please input your feed_time(mmdd hh24:mi). eg:1213 08:00
Enter value for feed_time: 1213 16:30
old 1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh24:mi'))
new 1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('1213 16:30','mmdd hh24:mi'))
1 row created.
--2.查看喂奶间隔:
test@DEMO> @v1
ID FEED_TIME L LAG(min)
---------- ------------------- - ----------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 129
8 2019-12-13 09:01:00 N 243
9 2019-12-13 10:40:00 L 99
15 2019-12-13 11:50:00 N 70
16 2019-12-13 13:16:00 N 86
19 2019-12-13 16:30:00 N 194
7 rows selected.
--3.查看喂奶间隔(排除Label='L'的情况):
test@DEMO> @v2
ID FEED_TIME L LAG(min)
---------- ------------------- - ----------
6 2019-12-13 02:49:00 N
7 2019-12-13 04:58:00 N 129
8 2019-12-13 09:01:00 N 243
15 2019-12-13 11:50:00 N 169
16 2019-12-13 13:16:00 N 86
19 2019-12-13 16:30:00 N 194
6 rows selected.
--4.确认无误提交事物:
test@DEMO> commit;
Commit complete.
test@DEMO>
可以清楚看到最新的一次喂奶间隔是194分钟,也是正常的_
使用SQL计算宝宝每次吃奶的时间间隔的更多相关文章
- 使用SQL计算宝宝每次吃奶的时间间隔(续)
本文是<使用SQL计算宝宝每次吃奶的时间间隔>的续篇,因为我工作繁忙,时常不能及时帮助媳妇儿记录,为了让不懂数据库的媳妇儿也可以自己用手机熟练操作.我继续做了一些修正和封装: 1.给媳妇儿 ...
- 使用SQL计算宝宝每次吃奶的时间间隔(数据保障篇)
目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿^_^)需求,具体可参考: 使用SQL计算宝宝每次吃奶的时间间隔 使用SQL计算宝宝每次吃奶的时间间隔(续) 那么本篇 使用SQL计算 ...
- SQL 计算列
SQL计算列,可以解决一般标量计算(数学计算,如ColumnA*ColumnB)的问题,而子查询计算(如select sum(salary) from tableOther where id=’ABC ...
- sql计算经纬度得出最近距离的公式
sql计算经纬度得出最近距离的公式 //根据经纬度计算两点距离 mappoint //数据库已有字段,商家经纬度 实例:113.272148,23.147299 $lon = "" ...
- SQL计算时间差并排除周末
SQL计算时间差并排除周末 CREATE FUNCTION DI_FN_GET_WorkDay (@begin DATETIME , @end DATETIME ) RETURNS int BEGIN ...
- 【HANA系列】SAP HANA SQL计算两个日期的差值
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL计算两个 ...
- 【HANA系列】SAP HANA SQL计算某日期是当月的第几天
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL计算某日 ...
- 【HANA系列】SAP HANA SQL计算某日期是当年的第几天
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL计算某日 ...
- Java工作流引擎节点接收人设置“按自定义SQL计算”系列讲解
关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单 拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...
随机推荐
- Medium高赞系列,如何正确的在Stack Overflow提问
在我们写程序的时候,经常会遇到各色各样的问题,在国内,小伙伴们经常去知乎.CSDN.博客园.思否.安卓巴士等地方提问并获得答案. 这些地方汇集了很多优秀的.爱分享的国内资源.小编比较自豪的一件事情就是 ...
- centos6的JDK安装
1. 通过如下命令查看当前操作系统是否存在JDK rpm -qa | grep java 如果出现以下内容说明你的操作系统存在jdk 2.那么依次通过如下命令进行删除它 rpm -e - -nodep ...
- Linux基于webRTC的二次开发(二) 实现远程桌面共享
webRTC中的desktop_capture模块提供了捕获桌面和捕获窗口的相关功能,而实现远程桌面共享功能需要将desktop_capture捕获的画面作为peerconnection的视频源,下面 ...
- 平滑启动shell脚本
# 平滑关闭和启动 Spring Boot 程序#设置端口SERVER_PORT="8090"#当前时间time=`date +%Y-%m-%d`#设置应用名称JAR_NAME=& ...
- [LC]88题 Merge Sorted Array (合并两个有序数组 )
①英文题目 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. N ...
- java编程思想第四版第六章总结
1. 代码重构 为什么f要代码重构 第一次代码不一定是完美的, 总会发现更优雅的写法. 代码重构需要考虑的问题 类库的修改不会破坏客户端程序员的代码. 源程序方便扩展和优化 2. 包 创建一个独一无二 ...
- 【译】利用Lombok消除重复代码
当你在写Getter和Setter时,一定无数次的想过,为什么会有POJO这么烂的东西.你不是一个人!(不是骂人-)无数的开发人员花费了大量的时间来写这种样板代码,而他们本来可以利用这些时间做出更有价 ...
- opencv 5 图像转换(3 重映射 仿射变换 直方图均衡化)
重映射 实现重映射(remap函数) 基础示例程序:基本重映射 //---------------------------------[头文件.命名空间包含部分]------------------- ...
- Ubuntu网络network eth0配置 | ubuntu network configuration
本文首发于个人博客https://kezunlin.me/post/5076bc45/,欢迎阅读! ubuntu network configuration Guide network proxy S ...
- (四十)golang--单元测试
传统的测试: package main import ( "fmt" ) func addUpper(n int) int { res := ; i <= n; i++ { ...