以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]计算工龄——两个时间相减  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=23234)

--  作者:leizhizhilun
--  发布时间:2012/9/6 12:33:00
--  [求助]计算工龄——两个时间相减

表格里要计算员工的工龄,需要得到的结果是几年几月几日,timespan里面没有年和月,我只会做到计算总天数,但是除365余数除30的这种方法肯定是不准确的,有没有更好的准确的方法?

Dim t As TimeSpan
t = Date.Today - CDate(CurrentTable.Current("进组时间"))
OutPut.Show("工龄:" & t.TotalDays)


--  作者:blackzhu
--  发布时间:2012/9/6 12:44:00
--  
DateDiff(interval,date1,date2)
返回两个日期之间的间隔。
Interval 包含以下设置:
yyyy 年
q    季度
m    月
y    某年的某一天
d    天
w    工作日
ww   周
h    时
n    分
s    秒 

--  作者:狐狸爸爸
--  发布时间:2012/9/6 12:46:00
--  

Dim i As integer = Date.Today.Year - CDate(CurrentTable.Current("进组时间")).Year

OutPut.Show("工龄:" & i )

[此贴子已经被作者于2012-9-6 12:47:09编辑过]

--  作者:leizhizhilun
--  发布时间:2012/9/6 12:59:00
--  

代码怎么写?


--  作者:leizhizhilun
--  发布时间:2012/9/6 13:00:00
--  

刚看到狐爸的回复,我试试


--  作者:狐狸爸爸
--  发布时间:2012/9/6 13:16:00
--  

标准算法:

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目96.table

 

Select Case e.DataCol.name
    Case "入职日期"
        If e.DataRow.IsNull("入职日期") Then
            e.DataRow("工龄") = Nothing
        Else
            Dim tp As TimeSpan = Date.today - CDate(e.DataRow("入职日期"))
            e.DataRow("工龄") = Math.Round(tp.TotalDays / 365.2422,2)
        End If
End Select

 

提示: 平均一年365.2422天


--  作者:leizhizhilun
--  发布时间:2012/9/6 15:29:00
--  

Dim y As Integer = Date.Today.Year - CDate(CurrentTable.Current("进组时间")).Year
Dim m As Integer = Date.Today.Month - CDate(CurrentTable.Current("进组时间")).Month
Dim d As Integer = Date.Today.Day - CDate(CurrentTable.Current("进组时间")).Day
If d < 0 Then
    m = m - 1
    d = Date.DaysInMonth(Today.AddMonths(-1).Year,Today.AddMonths(-1).Month) + Date.Today.Day - CDate(CurrentTable.Current("进组时间")).Day
End If
If m < 0 Then
    y= y - 1
    m = 12 + Date.Today.Month - CDate(CurrentTable.Current("进组时间")).Month
End If
OutPut.Show("工龄:" & y & "年" & m & "月" & d & "天")

 

 

谢谢狐爸,解决了!!


--  作者:leizhizhilun
--  发布时间:2012/9/6 15:55:00
--  

Select Case e.DataCol.name
    Case "工龄"
        Dim y As Integer
        Dim m As Integer
        Dim d As Integer
        If e.DataRow.IsNull("进组时间") Then
            e.DataRow("工龄") = Nothing
        Else
            y = Date.Today.Year - CDate(e.DataRow("进组时间")).Year
            m = Date.Today.Month - CDate(e.DataRow("进组时间")).Month
            d = Date.Today.Day - CDate(e.DataRow("进组时间")).Day
            If d < 0 Then
                m = m - 1
                d = Date.DaysInMonth(Today.AddMonths(-1).Year,Today.AddMonths(-1).Month) + Date.Today.Day - CDate(e.DataRow("进组时间")).Day
            End If
            If m < 0 Then
                y= y - 1
                m = 12 + Date.Today.Month - CDate(e.DataRow("进组时间")).Month
            End If
            e.DataRow("工龄") = y & "年" & m & "个月" & d & "天"
        End If

End Select

 

 

我在表属性中的DataColChanged事件中加入如上代码,工龄没有自动计算,求解!!

 

 


图片点击可在新窗口打开查看此主题相关图片如下:111.png
图片点击可在新窗口打开查看

--  作者:lin_hailun
--  发布时间:2012/9/6 16:16:00
--  
 楼主,重置工龄列,触发DataColChanged事件。


[此贴子已经被作者于2012-9-6 16:17:49编辑过]

--  作者:leizhizhilun
--  发布时间:2012/9/6 16:58:00
--  

必须重置才能触发吗?那多不方便啊,万一要修改还得重置,能不能只要"进组日期"列修改"工龄"列就自动触发修改呢?