教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧
例:公司員工采取三個(gè)輪班制度:凌晨0:00到早上8:00為第一班,早上8:00到下午4:00為第二班,下午4:00到晚上12:00為第三班。
員工使用電子時(shí)鐘進(jìn)行簽名,這種電子簽名可以自動(dòng)將記錄添加到SQL Server數(shù)據(jù)庫中。但是,有時(shí)候,需要增加一個(gè)夜班;即使這個(gè)輪班發(fā)生在第二天,它仍然會(huì)被認(rèn)為是第三班。
你也許希望根據(jù)輪班對(duì)記錄進(jìn)行分組,但是在你的計(jì)劃中會(huì)有兩個(gè)非常令人頭痛的問題:
(1)不是所有的雇員都是按時(shí)到達(dá)的;
(2)有時(shí)候員工工作的時(shí)間會(huì)比他們的一個(gè)輪班的時(shí)間長一些。
為了能在你的列表中得到正確的分組,你必須假設(shè)所有的員工能在一個(gè)輪班的開始和結(jié)束時(shí)間之間的任意時(shí)間開始工作。
使用CASE語句是一種解決辦法。Listing A中的SQL語句告訴我們,在創(chuàng)建測試表沒有錯(cuò)誤的情況下,它是如何工作的。
為了使程序代碼完全準(zhǔn)確的運(yùn)行,你需要在時(shí)間的小窗口中得到每一個(gè)輪班的開始時(shí)間和下一個(gè)輪班的結(jié)束時(shí)間。在剛才的例子中,你可以用"15:59:59.123"這個(gè)值代替@StartTime,然后再重新運(yùn)行代碼。這時(shí)候,你必須在每一個(gè)輪班結(jié)束的分界點(diǎn)上增加999毫秒。
解決方案
這個(gè)例子假設(shè)輪班時(shí)間從來沒有改變過,但是如果改變了輪班時(shí)間該怎么辦呢?你必須仿照這個(gè)例子并根據(jù)改變了的時(shí)間寫出所有的代碼。
一個(gè)更好一點(diǎn)的主意就是,針對(duì)我們的輪班創(chuàng)建一個(gè)表來調(diào)用Shifts的開始時(shí)間和結(jié)束時(shí)間。在這個(gè)表中,你可以修改Case語句來查找StopTime列。
Listing B中包含了創(chuàng)建Shifts表并向該表中增加記錄的代碼。代碼在一個(gè)輪班中設(shè)置了時(shí)間后,這樣使代碼看上去既簡單又靈活:
DECLARE @StartTime VARCHAR(20)
SET @StartTime ="22:59:59"
SELECTTOP 1 ShiftName FROM ShiftWork.Shifts
WHERE Shifts.StartTime <= @StartTime
ORDERBY StartTime DESC
我之所以要將輪班記錄進(jìn)行降序排列,是為了避免第三個(gè)輪班的邊界問題。我將用一些測試案例來論證我的結(jié)論,這些內(nèi)容你可以在Listing C中看到。
實(shí)際上,你可以將這個(gè)邏輯應(yīng)用到TemeCards表的記錄中去,而不需要?jiǎng)?chuàng)建另外的表,也就不需要在表中增加數(shù)據(jù)了。我同樣使用一個(gè)簡單的變量來論證我的邏輯。
相關(guān)文章
SQL?server插入報(bào)錯(cuò):當(dāng)?IDENTITY_INSERT?設(shè)置為?OFF?時(shí)不能為表?‘XXX‘?
這篇文章主要介紹了SQL?server插入報(bào)錯(cuò):當(dāng)?IDENTITY_INSERT?設(shè)置為?OFF?時(shí),不能為表?‘XXX‘?中的標(biāo)識(shí)列插入顯式值的問題,該問題是給SQL server數(shù)據(jù)庫中的某個(gè)表插入數(shù)據(jù)引起的報(bào)錯(cuò),一般出現(xiàn)在該表為自增的情況下,本文給大家分享解決方法,需要的朋友可以參考下2023-09-09
我也有微信朋友圈了 Android實(shí)現(xiàn)
最近寫了一個(gè)簡單的朋友圈程序,包含了朋友圈的列表實(shí)現(xiàn),視頻的錄制、預(yù)覽與上傳,圖片可選擇拍照或者從相冊(cè)選取,從相冊(cè)選取可以一次選擇多張照片,并且限制照片的張數(shù),想擁有真正屬于自己的朋友圈嗎?快來圍觀2016-05-05
CPU?核心數(shù)超過?Enterprise?Server/CAL?限制問題的解決方法
最近有客戶要求安裝sql?server?2019?數(shù)據(jù)庫,安裝過程中提示Enterprise?Server/CAL?CPU?核心利用率限制規(guī)則生成了警告,CPU?核心數(shù)超過?Enterprise?Server/CAL?限制,20?個(gè)物理核心,或已啟用超線程的?40?個(gè)邏輯核心,原來企業(yè)版也是有區(qū)別的2024-04-04
SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法
這篇文章主要介紹了SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法,涉及SQL Server的循環(huán)、遍歷、判定及插入等相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
MSSQL內(nèi)外連接(INNER JOIN)語句詳解
這幾天重新溫習(xí)了一下SQL的書本,現(xiàn)在的思路應(yīng)該是很清楚了,現(xiàn)在把自己的理解發(fā)出來給大家溫習(xí)下。希望和我一樣對(duì)SQL的連接語句不太理解的朋友能夠有所幫助2006-11-11
簡單觸發(fā)器的使用 獻(xiàn)給SQL初學(xué)者
簡單觸發(fā)器的使用 獻(xiàn)給SQL初學(xué)者,使用sqlserver的朋友可以參考下。2011-09-09

