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

