如何使用SQL計算寶寶每次吃奶的時間間隔(文末含PPT)
編者的話:搞好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 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分鐘,也是正常的^_^
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556440/viewspace-2668721/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何修改Fiori Launchpad裡Tile計數呼叫的時間間隔
- 能復活超級英雄的除了時間寶石,還有量子計算機?計算機
- now-go時間百寶箱Go
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度
- JavaScript計算兩個時間點之間的時間差JavaScript
- 支付寶修改隱私權政策時間
- 時間格式化大小寫含義(Java 計算時間差以及比較日期大小 )Java
- 時間差計算
- PHP時間計算PHP
- 演示如何建立 POSIX 相容的間隔定時器定時器
- 寶馬X1上市時間 寶馬x1新款怎麼樣
- 軟體工程之美-寶玉-極客時間軟體工程
- 時間複雜度的計算時間複雜度
- Java併發程式設計實戰-王寶令-極客時間Java程式設計
- [20200402]增量檢查點時間間隔.txt
- Oracle計算時間函式(對時間的加減numtodsinterval、numtoyminterval)Oracle函式
- TimeDateCalculator for mac 時間計算器Mac
- 2020款換代寶馬4系時間 2020款寶馬4系什麼時候上市
- 【月光寶盒get√】用時間置換空間,聊聊稀疏陣列的那些事兒陣列
- sql server 計算兩個時間 相差的 幾天幾時幾分幾秒SQLServer
- JS呼叫時間的方法和計算JS
- 【Python】我是如何使計算時間提速25.6倍的Python
- 邦芒寶典:網投簡歷的zui佳時間段UI
- ORACLE計算2個時間段相差時間小時、分、秒Oracle
- 實時計算如何幫助淘寶實現線上「實時選品」?
- PHP 時間格式化計算PHP
- ST ADC取樣時間計算
- Stopwatch 計算程式執行時間
- 餘額寶:在過去11年間餘額寶已為使用者累計賺取了4499億元的收益
- 時間換算
- H5首屏時間的計算H5
- ijkplayer 音視訊同步時間的計算
- ffmpeg裡的時間計算和轉換
- 含ppt下載|解析支付寶移動端彈性動態架構架構
- oracle計算兩個日期的時間差時分秒Oracle
- 使用pytz模組進行時區轉換及時間計算
- python程式計算執行時間差Python
- py 計算去年,明年,多少天前的時間