如何判断某值在序列[2-5,6-16,20-28]中?

杨哥儿 2008-09-24 03:27:15
我有一值勤表:
xm rq
张三 1-5,10-14,18-23,27-30
李四 6-9,15-17,24-26
王五 5-15,20-22
现在我如何判断某一天某人是否在值班?
如:给定函数f(xm,rq)
得f(张三,20)=true;
f(李四,20)=false;


特请教该函数如何写?
...全文
170 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsftest 2008-09-29
  • 打赏
  • 举报
回复
直接用31位数(二进制数或字符串)来标识某人某月每一天的出勤情况,例如:

张三 1-5,10-14,18-23,27-30 等于:
1111100001111100011111100011110



李四 6-9,15-17,24-26 等于:
0000011110000011100000011100000

诸如此类。

杨哥儿 2008-09-29
  • 打赏
  • 举报
回复
对方已经承认了错误,但用户数量已经太大.无法更改了.我是做二次开发的.没办法!!
lsftest 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 uself 的回复:]
谢谢,看来我只能另加一字段来翻译这个字符串了.
因为库是别人设计的,我不能动!
感谢各位给我的建议!!
[/Quote]
那更好啊,既然库是别人设计的,你就抓住他问他为什么设计成这样,是不是有些什么独门秘技没有告诉你。
杨哥儿 2008-09-29
  • 打赏
  • 举报
回复
谢谢,看来我只能另加一字段来翻译这个字符串了.
因为库是别人设计的,我不能动!
感谢各位给我的建议!!
lsftest 2008-09-29
  • 打赏
  • 举报
回复
如果你坚持这种记工天的方式,即使现在的问题你解决了,后面却很可能有更麻烦的问题等着你,例如说按上班天数算工资之类。至于你说的显示需要倒好解决。数据库结构的设计要有前瞻性、全局观,不要图一时之快。
杨哥儿 2008-09-29
  • 打赏
  • 举报
回复
回复楼上两位高手:
出勤日期这个字段是从两个方面来考虑的.
1是显示的需要,"张三 1-5,10-14,18-23,27-30"在数据表现时根本不用转换,也符合用户的使用习惯!
2是简单的需要(至少设计时是这样考虑的,不过现在已经不是简单的了),当然如果日期检查函数解决了,我在存储过程中加上我个函数后,也算简单了.

感觉问题讨论到这,引来诸多高手!我也该加点分了.
  • 打赏
  • 举报
回复
"26-26","26" 有什么实质区别啊 自己判断下数组下标最大值不就好了 (我指使用split分组后的数组)
vbman2003 2008-09-28
  • 打赏
  • 举报
回复
不谈算法,我觉得楼主思路要改一下
首先你这是个数据库相关程序吧,那么如果你设计的数据库结构,连这样一个简单的查询SQL语句都实现不了,我觉得应该说设计是不成功的,至少是有问题的......
还是建议你修改数据库结构,如果不能修改,那么就在当前字段存取数据的结构上动动脑筋.....
表中的数据不是直接用来让用户看的,所以你的这种1-5,8-10这样的结构可以考虑改一下,以利于数据查询。比如你前面提到的用1和0的结构,这个要比你现在的结构好,还是看看你的示例数据:
01-05,10-14,18-23,27-30 转换为11111000011111100011111100011110这样存储,那么要实现你现在的查询就简单了:
select * from tb where xm='AA' and mid(rq,20,1)='1'
...........


杨哥儿 2008-09-27
  • 打赏
  • 举报
回复
谢谢小刀的方法:
如果日期字串固定为6个字符,有没有理简单的方法:
张三 01-05,10-14,18-23,27-30
李四 06-09,15-17,26-26
王五 05-15,20-22
特别的,单独一天如26也要写成"26-26,",不能"26,"
这样就好办了.
  • 打赏
  • 举报
回复
不如用1个32bit 数据类型表示 也就是1个Long 整数 1~31Bit位代表某天1~31号是否在值
处理基础数据的时候可以这样

1-5
2^5-2^(1-1)=(11111)2
6-10
2^10-2^(6-1)=1111100000

然后把某个人所有值班数据转换后的值相加 活着用 or 运算也可以

位运算比较快速且节省空间
杨哥儿 2008-09-24
  • 打赏
  • 举报
回复
可不可以生成一个临时表(或数组),根据日期序列给指定位置填充数值.然后检查某位置是否变化判断是否存在/
如1-5,10-14,18-23,27-30 转化成:
array a={1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,0}
if a(20)=1 then f("张三",20)=true
vbman2003 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 uself 的回复:]
微软的office中有一个序列判断好象是lookup函数.但不知是怎么实现的.
[/Quote]
感觉上应该有巧妙的算法.......
有空时到可以想想
杨哥儿 2008-09-24
  • 打赏
  • 举报
回复
我也想按9楼和10楼的办法.但实际上表不允许每人有多打记录.
杨哥儿 2008-09-24
  • 打赏
  • 举报
回复
微软的office中有一个序列判断好象是lookup函数.但不知是怎么实现的.
vbman2003 2008-09-24
  • 打赏
  • 举报
回复
小刀说的对,改一下表结构,会省许多事
  • 打赏
  • 举报
回复
最好把这些基础信息存在数据库中 1个语句就可以查询得结果

张三 1-5,10-14,18-23,27-30
李四 6-9,15-17,24-26
王五 5-15,20-22

xm srq erq
张三 1 5
张三 10 14
张三 18 23
张三 27 30
.
.
.
查询某个人某天是否在值班
select * from tb where xm='张三' and rq between srq and erq
查询某天哪些人在值班
select * from tb where rq between srq and erq

LCAAA 2008-09-24
  • 打赏
  • 举报
回复
那把条件改一下,刚才没看清楚,不好意思。。


Function CardObjCheckIsAvai(CodeObj As String, rq As long ) As Boolean
ObjProjectCheckIsAvai = False

ITEMCODE2() As String
ssnn.Open "SELECT * FROM 表名 WHERE (xm = " & CodeObj & ")", cn_desc
Do While Not ssnn.EOF
ITEMCODE2 = Split(ssnn("rq"), "-")
For i = LBound(ITEMCODE2) To UBound(ITEMCODE2) - 1
if i = rq then
ObjProjectCheckIsAvai =true
exit do
endif
Next
ssnn.MoveNext
Loop
ssnn.Close
End Function




vbman2003 2008-09-24
  • 打赏
  • 举报
回复
直线思维的代码:
Function GetValue(ByVal xm As String, ByVal rq As Long) As Boolean

Dim cn As connection
Dim rs As Recordset
Dim arr
Dim i As Long, j As Long
Dim b As Long, e As Long

'连接数据库
Set cn = New connection
'cn.open......
'返回记录集
Set rs = New Recordset
'rs.open "select * from tb where xm='" & xm & "'",cn......
arr = rs!xm
arr = Split(arr, ",")
For i = 0 To UBound(arr)
b = Split(arr(i), "-")(0)
e = Split(arr(i), "-")(1)
For j = b To e
If j = rq Then
GetValue = True
Exit Function
End If
Next j
Next i

End Function

没测试......
杨哥儿 2008-09-24
  • 打赏
  • 举报
回复
不用Split分组,有没有其它的好方法?
杨哥儿 2008-09-24
  • 打赏
  • 举报
回复
"if inst(ssnn("rq"),"rq") > 0"
并不能检查出20在字串18-23中.
加载更多回复(3)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧