背景:
最近在維護乙個專案, 因新功能需求拓展. 有乙個字段儲存 乙個星期中的幾天,可能是全部,也有可能只是其中的星期一, 星期三,等.
因為專案中有乙個列舉值, 已作好初始化賦值工作, 而且 客戶端開發時直接把組合值合併成乙個早已存入這個欄位到db.
我在專案別的地方(動態批量生成月報表時,又需要得到這個具體的頻率值. 因為每個月有幾個星期一,星期三,不是固定的, 需要動態計算.), 所以, 又需要將其還原為 其中具體對應的 星期一,星期三 等. 這裡就需要對這個組合值,進行求模操作. 於是便有了本文.
執行環境: sql server 2014
測試環境: sql server 2005
我們資料庫中,有條記錄,某個欄位值存的就是1552, 表示頻率取 每週五,每週六,每週日各一次
sql指令碼:
declare @total bigint
set @total=1552
--55451121212121
--784546
--2558=1024*2 + 256*1 + 128 * 1 + 64 * 1 + 32 * 1 + 16 * 1 + 1 * 14
--1552= 1024*1 + 512 * 1 + 16*1
--1553= 1024*1 + 512 * 1 + 16*1 + 1 * 1
-- 1554 = 1024*1 + 512 * 1 + 16*1 + 1 * 2
-- 1025 = 1024* 1 + 1 * 1
declare @tblrecurrencetype table
( [dayname] varchar(20),
[dayvalue] bigint,
id bigint identity)
insert into @tblrecurrencetype
( [dayname],
[dayvalue]
)select 'everysaturday',1024
--union all select 'everyworkday',992
union all select 'everyfriday',512
union all select 'everythursday',256
union all select 'everywednesday',128
union all select 'everytuesday',64
union all select 'everymonday',32
union all select 'everysunday',16
union all select 'unknown',1
--select * from @tblrecurrencetype
declare @itime bigint
set @itime=0;
declare @tmpdayvalue bigint
set @tmpdayvalue=0
declare @itblrowcount bigint
set @itblrowcount=0
select @itblrowcount=count(*) from @tblrecurrencetype
while @total>0
begin
set @itime=@itime+1;
select @tmpdayvalue=dayvalue from @tblrecurrencetype where id=@itime
if(@total
begin
if(@itime=@itblrowcount)
begin
from @tblrecurrencetype where [dayvalue]<=@total
endelse
begin
from @tblrecurrencetype where [dayvalue]=@total
endcontinue
end
else
begin
begin
from @tblrecurrencetype where [dayvalue]=@tmpdayvalue
set @total = @total % @tmpdayvalue
endelse
begin
from @tblrecurrencetype where [dayvalue]=@total
set @total = @total - @tmpdayvalue
if(@total<0)
break
endend
end--select @itime -- running times
備註:
本來,可以寫得相對簡單一些. 但完成我需要的功能後. 發現這其實就是乙個貪婪演算法的實現. 想起了n久前某位老師提到的售票員找零問題, 於是, 便有了上面的sql指令碼.
在上面的初始化值中 特意加了一行 unknown , 單位為1, 確保求模結果完全正確.
( 結束)
貪婪演算法實現裝箱
貪婪演算法實現裝箱操作 public class test 裝箱函式 public void putthehuowu huowu h int num 1 box box null for int i 0 i h.length i boolean isok false box currentbox b...
python搜尋演算法實現 (二)貪婪演算法
假設你辦了個廣播節目,要讓全美國50個州的聽眾都能聽得到,為此,你需要決定在哪些廣播台播出。每個廣播台臺播出都需要費用,所以你需要盡可能地在更少的廣播台播出節目。現有廣播台名單如下 每個廣播台都覆蓋不同的範圍,但是有些是重複的 如何才能找出覆蓋全美50個州的最小廣播台集和呢?先提供一種方法 1 列出...
演算法 用js實現貪婪演算法(覆蓋問題)
適合了解該演算法的人理解 貪婪演算法 覆蓋問題 var obj 存放出現過的字母 var arr letter 存放未擁有arr letter元素最多的obj key值 var arr obj 找到未擁有arr letter元素最多的obj key值 function findmaxobj if m...