设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2716|回复: 8
打印 上一主题 下一主题

日期函数求助?

[复制链接]
跳转到指定楼层
1#
发表于 2005-11-4 16:36:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
怎么样能实现根据一个日期 自动识别该月份有多少天数 如2005-10-20 自动得出31天的

顺便求助大侠们帮我作个公式:因为我们单位人员流量大,工资发放有可能会几个月一发,.

工资原则是:上岗第一月份根据实际天数计算 如该月为31天 实际结果实为 月工资/31*工作天数

中间工作天数可采取月工资计算, 下岗月份工资也按上岗月份办法计算

我在表中设置了“上岗时间”“当前时间”“工作天数”“月工资”“总工资”“已发放工资”等几项

要求能实现“总工资”一栏能实现自上岗至下岗期间所产生工资总数

先谢谢啦
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
9#
 楼主| 发表于 2005-11-11 07:00:00 | 只看该作者
版主,我又作了一个,现在能够解决跨年及重月的问题了,还得麻烦你有时间看看

我也想用VBA编写一个,可是我还不会呢,呵呵!

计算原则:一、上岗和下岗的月份为同一月,则计算方法为: 月工资/上岗月实际天数*实际工作天数

          二、上岗和下岗的月份不为同一月,但下岗月份为上岗下月份的次月,

               则计算方法为: 月工资/上岗月总天数*实际工作天数+月工资/下岗月总天数*实际工作天数

          三、上岗和下岗的月份不为同一月,且中间跨整月(1日-30日或31日),则计算方法为 “第二条” +整月工资*N

               跨年度整月(下岗年份-上岗年份)*12+(下岗月份-上岗年份)+1  

          四、跨年度计算的判断方法,年份相同并且月份相同,符合条件的,则执行“第一条"

                                                         任何不符合条件的,则执行“第三条”

=IF(AND(YEAR(e5)=YEAR(d5),MONTH(e5)=MONTH(d5)),C6/DAY(DATE(YEAR(d5),MONTH(d5)+1,0))*(DAY(e5)-DAY(d5)+1),C6/DAY(DATE(YEAR(d5),MONTH(d5)+1,0))*(DAY(DATE(YEAR(d5),MONTH(d5)+1,0))-DAY(d5)+1)+((YEAR(e5)-YEAR(d5))*12+(MONTH(e5)-MONTH(d5))-1)*C6+C6/DAY(DATE(YEAR(e5),MONTH(e5)+1,0))*DAY(e5))

[此贴子已经被作者于2005-11-10 23:02:59编辑过]

8#
发表于 2005-11-11 06:08:00 | 只看该作者
如果你实在要简单,建议使用VBA写一个自定义函数,用起来就方便了。
7#
发表于 2005-11-11 06:06:00 | 只看该作者
以下是引用zhaoyangsd在2005-11-10 15:54:00的发言:





先谢谢版主啦





不过有个问题,例如datedif(2005-5-20,2006-1-19,"m")-1 计算结果是 7   





而datedif(2005-5-20,2006-1-20,"m")-1 计算的结果的是 8  





显然他是从本月20日到下月19日 计算为一个月













"Y"

一段时期内完整的年数。



"M"

一段时期内完整的月数。



"D"

一段时期内的天数。



"MD"

start_date 和 end_date 之间相差的天数。忽略日期的月数和年数。



"YM"

start_date 和 end_date 之间相差的月数。忽略日期的天数和年数。



"YD"

start_date 和 end_date 之间相差的天数。忽略日期的年数。

我想请问一下 用什么办法能实现  只忽略日期的天数  (我就想要结果是 8 啊 嘿嘿)





期待版主早点为我答复哦  [em07]



Datedif()函数不存在本月20日到下月19的区别的,它计算的月份是周月(就借用这个词吧,即满一个月才算1),如果你希望那样,有几个方法可以实现:

1、如果年相等,就用你原来的month()-month();如果年不等,就用Month()-Month()+12

2、如果下岗的日期<上岗的日期,用Datedif()函数不减1;否则用我建议的用Datedif()-1

6#
 楼主| 发表于 2005-11-10 23:54:00 | 只看该作者
以下是引用红池坝在2005-11-5 22:38:00的发言:

似乎无法再精减了,讲究着用吧。稍稍修改了一下,变成:

=IF(DATEDIF(D5,E5,"m"),DATEDIF(D5,DATE(YEAR(D5),MONTH(D5)+1,1),"d")*C5/DAY(DATE(YEAR(D5),MONTH(D5)+1,0))+(DATEDIF(D5,E5,"m")-1)*C5+DAY(E5)*C5/DAY(DATE(YEAR(D5),MONTH(D5)+1,0)),(DAYS360(D5,E5)+1)*C5/DAY(DATE(YEAR(D5),MONTH(D5)+1,0)))

1、改条件判断:

month(e5)=month(d5)  为:

datedif(d5,e5,"m")

看起来要短点,不过结果刚好相反,当你的条件为1时,我的刚好为0(Excel中,1为真,0为假),所以,后面两部分的位置要调整一下。

2、改中间间隔的月数:

(MONTH(e5)-1-MONTH(d5)    为:

(DATEDIF(D1,E1,"m")-1)

你的如果跨年就完了,比如2005-11-25到2006-1-10就出问题了

3、改上岗月的在岗天数:

(DAY(DATE(YEAR(d5),MONTH(d5)+1,0))-DAY(d5)+1)    为:

datedif(d5,DATE(YEAR(d5),MONTH(d5)+1,1),"d")

也是看起来短些,因为你原来的在乘后面的日工资的时候必须在两边加个括号,而使用Datedif()就不必要这两个括号了



[em01]

先谢谢版主啦



不过有个问题,例如datedif(2005-5-20,2006-1-19,"m")-1 计算结果是 7   



而datedif(2005-5-20,2006-1-20,"m")-1 计算的结果的是 8  



显然他是从本月20日到下月19日 计算为一个月











"Y"

一段时期内完整的年数。



"M"

一段时期内完整的月数。



"D"

一段时期内的天数。



"MD"

start_date 和 end_date 之间相差的天数。忽略日期的月数和年数。



"YM"

start_date 和 end_date 之间相差的月数。忽略日期的天数和年数。



"YD"

start_date 和 end_date 之间相差的天数。忽略日期的年数。

我想请问一下 用什么办法能实现  只忽略日期的天数  (我就想要结果是 8 啊 嘿嘿)



期待版主早点为我答复哦  [em07]

[此贴子已经被作者于2005-11-10 15:58:47编辑过]

5#
发表于 2005-11-6 06:38:00 | 只看该作者
似乎无法再精减了,讲究着用吧。稍稍修改了一下,变成:

=IF(DATEDIF(D5,E5,"m"),DATEDIF(D5,DATE(YEAR(D5),MONTH(D5)+1,1),"d")*C5/DAY(DATE(YEAR(D5),MONTH(D5)+1,0))+(DATEDIF(D5,E5,"m")-1)*C5+DAY(E5)*C5/DAY(DATE(YEAR(D5),MONTH(D5)+1,0)),(DAYS360(D5,E5)+1)*C5/DAY(DATE(YEAR(D5),MONTH(D5)+1,0)))

1、改条件判断:

month(e5)=month(d5)  为:

datedif(d5,e5,"m")

看起来要短点,不过结果刚好相反,当你的条件为1时,我的刚好为0(Excel中,1为真,0为假),所以,后面两部分的位置要调整一下。

2、改中间间隔的月数:

(MONTH(e5)-1-MONTH(d5)    为:

(DATEDIF(D1,E1,"m")-1)

你的如果跨年就完了,比如2005-11-25到2006-1-10就出问题了

3、改上岗月的在岗天数:

(DAY(DATE(YEAR(d5),MONTH(d5)+1,0))-DAY(d5)+1)    为:

datedif(d5,DATE(YEAR(d5),MONTH(d5)+1,1),"d")

也是看起来短些,因为你原来的在乘后面的日工资的时候必须在两边加个括号,而使用Datedif()就不必要这两个括号了



[em01]

[此贴子已经被作者于2005-11-5 22:42:23编辑过]

4#
 楼主| 发表于 2005-11-5 22:07:00 | 只看该作者
我作了一个,不过太长了,帮我看看能不能简化点啊C5=月工资  D5=上岗日期  E5=下岗日期或Today()=IF(MONTH(e5)=MONTH(d5),c5/DAY(DATE(YEAR(d5),MONTH(d5)+1,0))*(DAYS360(d5,e5)+1),c5/DAY(DATE(YEAR(d5),MONTH(d5)+1,0))*(DAY(DATE(YEAR(d5),MONTH(d5)+1,0))-DAY(d5)+1)+(MONTH(e5)-1-MONTH(d5))*c5+c5/DAY(DATE(YEAR(e5),MONTH(e5)+1,0))*DAY(e5))
3#
 楼主| 发表于 2005-11-5 21:21:00 | 只看该作者
谢谢2楼啊
2#
发表于 2005-11-5 04:55:00 | 只看该作者
“当前时间”是多余的吧,用Now()或者Today()都可以得到的,没有必要专门用一列来,最多用一个单元格来显示“今天”就行了。另外,你要计算的“总工资”是“上岗时间”到“下岗时间”之间产生的工资,可你的表中没有“下岗时间”的信息吧?我这里给你一个计算两个日期之间的天数的函数吧:

=DATEDIF(B2,C2,"d")        (开始时间在B2,结束时间在C2)

=DATEDIF(B2,TODAY(),"d")   (开始时间在B2,结束时间是今天)至于你说的如果取得某个日期的当月天数,用下面的公式吧:

=DAY(DATE(YEAR(B2),MONTH(B2)+1,0)) (返回B2单元格的日期所在月份的天数)这些都是Excel中最基本的日期函数和公式,有了上面的公式,我想你的问题应该可以解决了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 18:08 , Processed in 0.112095 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表