成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用SQL只統計工作日的數據?

數據庫 MySQL
因為我們工作中其實很多時候確實只需要統計大家工作日的數據,比如考勤,有的甚至還有排除一些法定節假日(這個問題大家可以思考一下如何解決)。

[[388028]]

本文轉載自微信公眾號「SQL數據庫開發」,作者丶平凡世界。轉載本文請聯系SQL數據庫開發公眾號。

今天微信群里有位讀者提了個問題:如何用SQL統計一個月里工作日的數據?

我覺得這個問題問的挺好的,因為我們工作中其實很多時候確實只需要統計大家工作日的數據,比如考勤,有的甚至還有排除一些法定節假日(這個問題大家可以思考一下如何解決)。

下面我們針對讀者提出的這個問題,用SQL來進行求解。

題目

求解員工“張三”工作日上了多少天班?

測試數據

  1. CREATE TABLE Tmp0317 
  2. 姓名 VARCHAR(20), 
  3. 上班時間 DATETIME, 
  4. 下班時間 DATETIME 
  5.  
  6. INSERT INTO Tmp0317 VALUE ('張三','2021-03-01 08:05:03','2021-03-01 18:25:26'
  7. INSERT INTO Tmp0317 VALUE ('張三','2021-03-03 08:12:12','2021-03-01 18:01:16'
  8. INSERT INTO Tmp0317 VALUE ('張三','2021-03-04 08:11:24','2021-03-01 18:09:25'
  9. INSERT INTO Tmp0317 VALUE ('張三','2021-03-05 08:15:08','2021-03-01 18:14:43'
  10. INSERT INTO Tmp0317 VALUE ('張三','2021-03-09 08:20:26','2021-03-01 18:23:48'
  11. INSERT INTO Tmp0317 VALUE ('張三','2021-03-10 08:23:16','2021-03-01 18:19:04'
  12. INSERT INTO Tmp0317 VALUE ('張三','2021-03-11 08:19:13','2021-03-01 18:26:29'
  13. INSERT INTO Tmp0317 VALUE ('張三','2021-03-12 08:17:42','2021-03-01 18:11:12'
  14. INSERT INTO Tmp0317 VALUE ('張三','2021-03-13 08:15:37','2021-03-01 18:10:05'

分析

要求解工作日的天數,只需要排除掉周末即可,這里我們暫不考慮忘打卡的情況。我們可以借助SQL Server里面的系統表spt_values來進行求解

具體解法

  1. SELECT  
  2. SUM
  3. CASE WHEN DATEPART(WEEKDAY,DATEADD(DD,NUMBER,'2021-03-01' )) IN (1,7)  
  4. THEN 0  ELSE 1 END 
  5. AS WORKDAY 
  6. FROM MASTER..SPT_VALUES 
  7. JOIN Tmp0317 ON DATEADD(DAY, NUMBER, CONVERT(DATE'2021-03-01'))=CONVERT(DATE,上班時間) 
  8. WHERE TYPE='P'  
  9. AND NUMBER BETWEEN 0 AND DATEDIFF(DAY'2021-03-01', DATEADD(MONTH, 1, '2021-03-01'))-1 

(提示:可以左右滑動代碼)

結果為:

我們可以對照日歷表看下,“張三”在這幾天的工作日打開記錄:

其中紅色框表示工作日,綠色框表示周末,張三總共9條記錄,13日周六這天應該是回公司加班了,但是我們不算正常工作日的考勤記錄,所以結果是8.

代碼解析

上面的代碼估計很多讀者看的有點懵,這里我們將代碼先拆解開,看下每個函數里面的結果什么,大家就知道了。

首先是spt_values這個系統表,我們在之前的文章里有提到過具體的用法。

其次我們看下關聯條件:

  1. JOIN Tmp0317 ON  
  2. DATEADD(DAY, NUMBER, CONVERT(DATE'2021-03-01'))=CONVERT(DATE,上班時間) 

這里我們單獨看等號兩本的結果:

  1. SELECT  
  2. DATEADD(DAY, NUMBER, CONVERT(DATE'2021-03-01')) 
  3. FROM MASTER..SPT_VALUES  
  4. WHERE TYPE='P'  
  5. AND NUMBER BETWEEN 0 AND DATEDIFF(DAY'2021-03-01', DATEADD(MONTH, 1, '2021-03-01'))-1 

注意:這里必須加上后面的WHERE條件部分,其中后面的

DATEDIFF(DAY, '2021-03-01', DATEADD(MONTH, 1, '2021-03-01'))-1

的結果是30,這里因為我們的NUMBER是從0開始,所以后面要減去1,即從0-30,表示3月共31天

查詢出的結果如下:

后面還有16-31日的記錄未截取,大家可以去自己電腦上試驗一下。

然后再看等號右邊的結果:

  1. SELECT CONVERT(DATE,上班時間)  
  2. FROM Tmp0317 

結果如下:

這樣,我們就可以通過關聯條件來獲取到我們需要的上班日期了,但是這并不是工作日的上班日期,我們最后還要做一個判斷,那就是SELECT后面的CASE WHEN條件了。

CASE WHEN里面的代碼我們也單獨執行一下:

  1. SELECT  
  2.  
  3. DATEADD(DD,NUMBER,'2021-03-01' ), 
  4. DATEPART(WEEKDAY,DATEADD(DD,NUMBER,'2021-03-01' )) AS WORKDAY 
  5.  
  6. FROM MASTER..SPT_VALUES 
  7. JOIN Tmp0317 ON DATEADD(DAY, NUMBER, CONVERT(DATETIME, '2021-03-01'))=CONVERT(DATE,上班時間) 
  8. WHERE TYPE='P' AND NUMBER BETWEEN 0 AND DATEDIFF(DAY'2021-03-01', DATEADD(MONTH, 1, '2021-03-01'))-1 

我們將DATEPART里面的嵌套函數DATEADD也單獨拎出來,看下執行結果:

圖片

這里的DATEPART的功能主要是用來返回這一天是這個星期的第幾天,我們的系統日歷是按照美國的歷法,每周的第一天是星期日,所以2021-03-01的星期一是本周的第二天,以此類推,我們得到每一天對應在本周的第幾天。

知道這個結果后,我們可以得知,每個周的第2-6天是對應我們的工作日,那么我們可以取這個結果IN (2,3,4,5,6) 也可以 NOT IN (1,7)。

這里我們用CASE WHEN取的反義詞,當它IN (1,7)時我們返回0,表示不統計,其他結果返回1,表示統計。

即:

  1. SELECT  
  2.  
  3. DATEADD(DD,NUMBER,'2021-03-01' ), 
  4. DATEPART(WEEKDAY,DATEADD(DD,NUMBER,'2021-03-01' )), 
  5. CASE WHEN DATEPART(WEEKDAY,DATEADD(DD,NUMBER,'2021-03-01' )) IN (1,7) THEN 0  ELSE 1 END AS WORKDAY 
  6.  
  7. FROM MASTER..SPT_VALUES 
  8. JOIN Tmp0317 ON DATEADD(DAY, NUMBER, CONVERT(DATETIME, '2021-03-01'))=CONVERT(DATE,上班時間) 
  9. WHERE TYPE='P' AND NUMBER BETWEEN 0 AND DATEDIFF(DAY'2021-03-01', DATEADD(MONTH, 1, '2021-03-01'))-1 

結果為:

對WORKDAY列進行SUM求和就得到了我們的結果8

Q:這里能不使用spt_values嗎?

A:可以的,只需要構建一張臨時表,表結構也只需要一列,就是一列自增長的連續整數即可

 

責任編輯:武曉燕 來源: SQL數據庫開發
相關推薦

2012-10-11 15:32:53

筆記本聯想工作站

2022-04-30 07:53:54

Python腳本語言

2013-04-15 09:52:13

程序員

2015-11-11 16:52:49

高清視頻會議華為

2019-10-15 15:15:31

Python大數據函數

2017-11-16 09:20:00

CIOERP信息化

2014-05-27 10:09:21

大數據

2023-08-22 08:01:42

SpringBatch事務管理

2021-08-08 22:08:41

Redis開發網頁

2012-09-10 10:26:22

工作工作習慣調整心態

2010-04-01 10:20:30

Oracle時間日期操

2019-12-06 13:55:28

人社部大數據應用場景

2021-04-20 08:33:29

SQL快照數據

2019-04-26 13:20:24

數據庫PostgreSQL Oracle

2021-01-12 11:31:09

數據科學數據大數據

2019-08-01 15:47:25

數據備份遷移

2021-02-22 14:40:11

5G5G網絡5G終端

2015-08-14 14:29:00

數據分析

2019-11-26 11:19:40

統計數據互聯網

2010-04-20 14:06:56

Oracle SQL語
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日噜噜噜夜夜爽爽狠狠视频, | 国产欧美日韩一区二区三区 | 久久不卡 | 四虎国产 | 亚洲精品久久久久久久久久久久久 | 久久精品中文 | 亚洲v日韩v综合v精品v | 91精品国产91久久综合桃花 | 欧美日韩一区在线播放 | 午夜在线视频 | 日韩精品一区二区久久 | 国产亚洲一区二区三区在线 | 精品国产久 | av免费入口 | 天堂资源最新在线 | 成人在线免费观看视频 | 欧美不卡一区二区三区 | 黑人精品| 五月激情六月婷婷 | 亚洲精品久久久久久国产精华液 | 日韩在线播放av | 久久成人av电影 | 免费v片 | 美国十次成人欧美色导视频 | 欧美激情在线精品一区二区三区 | 国产精品久久一区 | 99reav| 亚洲精品1区 | 午夜精品一区二区三区在线视频 | 成人av在线网站 | 91文字幕巨乱亚洲香蕉 | 成人黄色av| 亚洲一区二区久久久 | 日韩精品无码一区二区三区 | 欧美一区二区在线 | 午夜影院视频在线观看 | 天天躁日日躁狠狠躁2018小说 | 日韩视频精品在线 | 日韩视频中文字幕 | 中文字幕亚洲一区二区三区 | 国产精品美女久久久久久免费 |