SQL Server記錄輪班的技巧_Mssql數(shù)據(jù)庫(kù)教程
推薦:SQL Server的EXISTS結(jié)構(gòu)學(xué)習(xí)有件東西我觀察了很多年,那就是很少有開(kāi)發(fā)者會(huì)去使用SQL Server中的一個(gè)非常有用的東西EXISTS結(jié)構(gòu)。你可以在各種情況中用到EXISTS結(jié)構(gòu),在這篇文章中我會(huì)向大家介紹其中的一些。 EXISTS結(jié)構(gòu) EXISTS結(jié)構(gòu)是一個(gè)TSQL函數(shù),這個(gè)函數(shù)會(huì)就圓括號(hào)中的子查詢返回一
例:公司員工采取三個(gè)輪班制度:凌晨0:00到早上8:00為第一班,早上8:00到下午4:00為第二班,下午4:00到晚上12:00為第三班。
員工使用電子時(shí)鐘進(jìn)行簽名,這種電子簽名可以自動(dòng)將記錄添加到SQL Server數(shù)據(jù)庫(kù)中。但是,有時(shí)候,需要增加一個(gè)夜班;即使這個(gè)輪班發(fā)生在第二天,它仍然會(huì)被認(rèn)為是第三班。
你也許希望根據(jù)輪班對(duì)記錄進(jìn)行分組,但是在你的計(jì)劃中會(huì)有兩個(gè)非常令人頭痛的問(wèn)題:
(1)不是所有的雇員都是按時(shí)到達(dá)的;
(2)有時(shí)候員工工作的時(shí)間會(huì)比他們的一個(gè)輪班的時(shí)間長(zhǎng)一些。
為了能在你的列表中得到正確的分組,你必須假設(shè)所有的員工能在一個(gè)輪班的開(kāi)始和結(jié)束時(shí)間之間的任意時(shí)間開(kāi)始工作。
使用CASE語(yǔ)句是一種解決辦法。Listing A中的SQL語(yǔ)句告訴我們,在創(chuàng)建測(cè)試表沒(méi)有錯(cuò)誤的情況下,它是如何工作的。
為了使程序代碼完全準(zhǔn)確的運(yùn)行,你需要在時(shí)間的小窗口中得到每一個(gè)輪班的開(kāi)始時(shí)間和下一個(gè)輪班的結(jié)束時(shí)間。在剛才的例子中,你可以用'15:59:59.123'這個(gè)值代替@StartTime,然后再重新運(yùn)行代碼。這時(shí)候,你必須在每一個(gè)輪班結(jié)束的分界點(diǎn)上增加999毫秒。
解決方案
這個(gè)例子假設(shè)輪班時(shí)間從來(lái)沒(méi)有改變過(guò),但是如果改變了輪班時(shí)間該怎么辦呢?你必須仿照這個(gè)例子并根據(jù)改變了的時(shí)間寫出所有的代碼。
一個(gè)更好一點(diǎn)的主意就是,針對(duì)我們的輪班創(chuàng)建一個(gè)表來(lái)調(diào)用Shifts的開(kāi)始時(shí)間和結(jié)束時(shí)間。在這個(gè)表中,你可以修改Case語(yǔ)句來(lái)查找StopTime列。
Listing B中包含了創(chuàng)建Shifts表并向該表中增加記錄的代碼。代碼在一個(gè)輪班中設(shè)置了時(shí)間后,這樣使代碼看上去既簡(jiǎn)單又靈活:
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è)輪班的邊界問(wèn)題。我將用一些測(cè)試案例來(lái)論證我的結(jié)論,這些內(nèi)容你可以在Listing C中看到。
實(shí)際上,你可以將這個(gè)邏輯應(yīng)用到TemeCards表的記錄中去,而不需要?jiǎng)?chuàng)建另外的表,也就不需要在表中增加數(shù)據(jù)了。我同樣使用一個(gè)簡(jiǎn)單的變量來(lái)論證我的邏輯。
分享:SQL Server 2005代理服務(wù)應(yīng)用軟件組成代理服務(wù)是一種復(fù)雜的技術(shù),具有很多可配置的移動(dòng)組件。詳細(xì)信息如下: 信息 信息是指在服務(wù)代理應(yīng)用程序中調(diào)用的基本信息單元。對(duì)于服務(wù)代理來(lái)說(shuō),信息的接收總是按照其被發(fā)送的順序進(jìn)行,并且保證僅發(fā)送和接收一次。同時(shí)保證信息不丟失。有時(shí)發(fā)送的信息不
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 看看自己掌握了多少SQL快捷鍵
- Sql學(xué)習(xí)第一天——SQL 將變量定義為Table類型(虛擬表)
- mdf文件和ldf文件導(dǎo)入到sql server 2005實(shí)現(xiàn)語(yǔ)句
- SqlServer獲取存儲(chǔ)過(guò)程返回值的實(shí)例
- 是什么讓SQL Server加速運(yùn)行
- 揭秘加快數(shù)據(jù)庫(kù)查詢速度的方法
- 如何在應(yīng)用環(huán)境中構(gòu)造最優(yōu)的數(shù)據(jù)庫(kù)模式
- sql 游標(biāo)的使用—游標(biāo)FOR循環(huán)小例子
- 詳解優(yōu)化SQL Server數(shù)據(jù)庫(kù)的方法
- 解讀數(shù)據(jù)庫(kù)的一些常識(shí)
猜你也喜歡看這些
- 擁有5星評(píng)級(jí)數(shù)據(jù)庫(kù)表結(jié)構(gòu) 如何才能更高效的使用?
- MySQL筆記之索引的使用
- Mysql兩種情況下更新字段中部分?jǐn)?shù)據(jù)的方法
- 網(wǎng)頁(yè)模板MySQL出現(xiàn)Can't create/write to file 'C:\Windows\TEMP\#sql_990_0.MYI解決辦法
- 使用MySQL Slow Log來(lái)解決MySQL CPU占用高的問(wèn)題
- SQL語(yǔ)句替換字段中的換行符,回車符
- mysql密碼過(guò)期導(dǎo)致連接不上mysql
- MYSQL SET類型字段的SQL操作知識(shí)介紹
- SQL2005錯(cuò)誤:2812 的解決方法
- Java連接MySql的詳細(xì)介紹
- 相關(guān)鏈接:
- 教程說(shuō)明:
Mssql數(shù)據(jù)庫(kù)教程-SQL Server記錄輪班的技巧
。