iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)
  • 374
分享到

如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)

2024-04-02 19:04:59 374人浏览 安东尼
摘要

编者的话:搞好sql可以做很多事情,比如说可以解决海盗分金的问题,可以用SQL把大象装进冰箱,还可以用SQL解决环环相扣的刑侦推理问题,近期,有位读者朋友投稿了“使用SQL计算宝宝每次吃奶的时间间隔”,大

编者的话:搞好sql可以做很多事情,比如说可以解决海盗分金的问题,可以用SQL把大象装进冰箱,还可以用SQL解决环环相扣的刑侦推理问题,近期,有位读者朋友投稿了“使用SQL计算宝宝每次吃奶的时间间隔”,大家可以一起借鉴下~

需求


媳妇儿最近担心宝宝的吃奶时间不够规律,网上说是正常平均3小时喂奶一次,让我记录下每次的吃奶时间,分析下实际是否偏差很大,好在下次去医院复查时反馈给医生。

此外,还要注意有时候哭闹要吃奶,而实际只吃了两口便不吃了。这种情况要特殊标记下,如果不算这种情况的话,分析看是否正常。

环境


oracle 11.2.0.4

1.记录每次吃奶时间

2.计算吃奶时间间隔

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 hh34:mi). eg:1213 08:00

  2* insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh34:mi'))

test@DEMO>

这样每次执行插入就可以方便的直接@i调用插入,比如刚刚媳妇儿告知我本次吃奶时间是13:16,那直接调用插入即可:

test@DEMO> @i

Please input your feed_time(mmdd hh34: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 hh34:mi'))

new   1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('1213 08:00','mmdd hh34:mi'))

1 row created.

test@DEMO> commit;

Commit complete.

确认刚刚插入的数据无误后,一定要记得提交事物。我之所以没有将commit写到脚本中,就是为了当发现数据输入有误,方便直接rollback回滚。

现在我们来看一下现有的数据,详细记录了每一次的吃奶时间:

test@DEMO> alter session set nls_date_fORMat='yyyy-mm-dd hh34: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 hh34: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 hh34:mi'))

new   1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('1213 16:30','mmdd hh34: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分钟,也是正常的^_^

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)

本文链接: https://www.lsjlt.com/news/45762.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql拒绝访问怎么办
    mysql 出现拒绝访问的原因和解决方法:权限问题:授予用户适当的数据库或表访问权限。防火墙或安全组:允许对 mysql 端口(3306)的入站连接。密码错误:重置 mysql 密码或使...
    99+
    2024-05-18
    mysql
  • mysql怎么比较日期大小
    mysql 中比较日期大小的方法包括:直接比较两个日期,使用 、= 运算符。使用 date_format() 函数将日期转换为字符串,然后比较字符串大小。使用 str_to_date()...
    99+
    2024-05-18
    mysql
  • mysql怎么加锁
    mysql中加锁是一种确保数据并发访问一致性的机制。加锁方式有:表级锁(对整个表加锁)和行级锁(对特定行加锁)。加锁类型有共享锁(允许读取但禁止修改)、排他锁(禁止读取和修改)和意向锁(...
    99+
    2024-05-18
    mysql 并发访问
  • mysql误删数据怎么恢复
    mysql误删数据可通过以下步骤恢复:停止数据库服务,防止数据覆盖。若开启binlog日志,可从中提取删除语句,再重新执行后将数据恢复。使用恢复工具修复表文件或恢复事务。从备份中恢复数据...
    99+
    2024-05-18
    mysql
  • 怎么判断mysql安装成功
    成功安装 mysql 的方法:检查命令行界面版本号;连接到 mysql 服务器,输入 "mysql -u root -p";创建数据库,输入 "create database test;...
    99+
    2024-05-18
    mysql linux macos 防火墙配置
  • mysql怎么修改表名
    如何修改 mysql 表名:检查当前表名:show tables;运行 rename table 语句:rename table 旧表名 to 新表名;验证更改:show tables;...
    99+
    2024-05-18
    mysql
  • mysql删除的表怎么恢复
    mysql 中已删除表的恢复方法主要涉及以下步骤:检查 binlog 日志以获取删除事务信息;使用数据恢复工具扫描数据库文件;从备份还原表数据;或联系 mysql 支持寻求帮助。 My...
    99+
    2024-05-18
    mysql 数据丢失
  • mysql复合主键怎么写
    在 mysql 中编写复合主键:在 create table 语句中使用 primary key 约束并列出字段名称。复合主键的好处包括提高查询效率、保证数据完整性和强制数据顺序。注意选...
    99+
    2024-05-18
    mysql
  • 怎么查看mysql数据库版本
    如何查看 mysql 数据库版本?连接到数据库并执行查询:select version();检查命令行或 mysql workbench 中的服务器属性。 如何查看 MySQL 数据库...
    99+
    2024-05-18
    mysql linux
  • 怎么检测mysql安装成功
    要验证 mysql 安装是否成功,请执行以下步骤:检查系统服务是否正在运行。使用 mysql 命令行工具连接到服务器。创建一个测试数据库并使用它。在数据库中创建一个测试表。插入测试数据并...
    99+
    2024-05-18
    mysql linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作