Để tính toán sử dụng bằng cách đặt một biến dạng KhoangThoiGian. Căn cứ vào KhoangThoiGian so sánh với mốc để chỉ ra được ngày cần tính.
a) Chỉ ra tên tháng cách KhoangThoiGianTheoThang n tháng
{QUOTE{Set KhoangThoiGianTheoThang 10}{=MOD(ABS({DATE \@ M}+KhoangThoiGianTheoThang+11);12)+1}/0 \@ MM}
Ví dụ nếu đặt KhoangThoiGianTheoThang=10 thì nếu tháng hiện tại là 02 thì tháng cần tính kết quả là 06.
Chỉ số/0 để nhận giá trị trả về là dạng “tháng”, nếu định dạng MMMM sẽ hiển thị được tên tháng bằng tiếng Anh.
b) Chỉ ra tháng năm cách KhoangThoiGianTheoThang n tháng
{QUOTE
{SET KhoangThoiGianTheoThang 10}
{SET m{=MOD({DATE \@ MM}+KhoangThoiGianTheoThang+11;12)+1}}
{SET y{=INT({DATE \@ yyyy}+(KhoangThoiGianTheoThang+{DATE \@ M}-1)/12)}} ”{m}-{y}” \@ “MM/yyyy”}
Nếu tháng năm hiện tại là 02/2010 và đặt KhoangThoiGianTheoThang là 10 thì sẽ được tháng năm cần tính là 6-5360, nếu định dạng MMMM sẽ hiển thị được tên tháng bằng tiếng Anh.
c) Chỉ ra tháng năm cách KhoangThoiGianTheoNam n năm
{QUOTE
{SET KhoangThoiGianTheoNam 1}
{DATE \@ MMMM}160{={DATE \@ yyyy}+KhoangThoiGianTheoNam}}
Nếu tháng năm hiện tại là 02/2010 và đặt KhoangThoiGianTheoNam là 1 thì sẽ được tháng năm cần tính là 02/42214, nếu định dạng MMMM sẽ hiển thị được tên tháng bằng tiếng Anh.
d) Chỉ ra ngày tháng năm cách KhoangThoiGianTheoNam n năm
{QUOTE
{SET KhoangThoiGianTheoNam 1}
{SET yy{={DATE \@ yyyy}+KhoangThoiGianTheoNam}} {SET mm{DATE \@ MM}}
{SET dd{={DATE \@ d}-({DATE \@ d}>28)*({DATE \@
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32{quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}
Nếuhôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ ba, 01/02/2011
Nếu khi ngày bắt đầu là ngày cuối cùng của tháng cách trên sẽ thiếu tổng quát, sử dụng cách tính này để chính xác hơn:
{QUOTE
{SET KhoangThoiGianTheoNam 1} {SET od{DATE \@ d}}
{SET oy{DATE \@ yyyy}} {SET mm{DATE \@ M}} {SET ld{=(mm=2)*(od=28+((MOD(oy;4)=0)+(MOD(oy;400)=0)- (MOD(oy;100)=0)))}} {SET yy{=oy+KhoangThoiGianTheoNam}} {SET dd{=ld*(28+(mm=2)*((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0)))+od*(1-ld)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}
Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ ba, 01/02/2011
e) Chỉ ra ngày tháng năm cách KhoangThoiGianTheoThang n tháng
{QUOTE
{SET KhoangThoiGianTheoThang 9}
{SET mm{=MOD(ABS({DATE \@ M}+KhoangThoiGianTheoThang+11);12)+1}} {SET yy{=INT({DATE \@ yyyy}+(KhoangThoiGianTheoThang+{DATE \@ M}- 1)/12)}}
{SET dd{=IF(({DATE \@
d}>28)*(mm=2)=1,28+((MOD(yy;4)=0)+(MOD(yy;400)=0)-
(MOD(yy;100)=0));IF((mm=4)+(mm=6)+(mm=9)+(mm=11)+({DATE \@ d}>30)>1;30;{DATE \@ d}))}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}
Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ hai, 01/11/2010.
Do code trên luôn chỉ đưa ra ngày mồng 1 của tháng nên nếu muốn chỉ rõ số ngày trùng với ngày hiện tại thì phải sửa chữa lại code. Trừ phi ngày bắt đầu là ngày cuối cùng của tháng (ví dụ tháng có 31 ngày), mà tháng đích có số ngày ít hơn số ngày của tháng hiện tại (ví dụ chỉ có 30 ngày), sẽ đưa ra số ngày cuối
của tháng đích (là 30 chứ không phải 31, vì thángđích không có ngày 31). {QUOTE
{SET KhoangThoiGianTheoThang 8} {SET od{DATE \@ d}}
{SET om{DATE \@ M}} {SET oy{DATE \@ yyyy}}
{SET ld{=(om=2)*(od=28+((MOD(oy;4)=0)+(MOD(oy;400)=0)- (MOD(oy;100)=0)))+((om=4)+(om=6)+(om=9)+(om=11))*(od=30)+(od=31)}} {SET mm{=MOD(ABS(om+KhoangThoiGianTheoThang+11);12)+1}} {SET yy{=INT(oy+(KhoangThoiGianTheoThang+om-1)/12)}} {SET dd{=ld*(31-(mm=2)*(3-((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0)))-((mm=4)+(mm=6)+(mm=9)+(mm=11)))+(1- ld)*(od*(mm=2)*(od<29)+od*(mm<>2)+(od>28)*(mm=2)*(28+(MOD(yy;4)=0)+ (MOD(yy;400)=0)-(MOD(yy;100)=0)))}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}
Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ hai, 01/11/2010
Nếu muốn lùi trước một ngày sử dụng code sau: {QUOTE
{SET KhoangThoiGianTheoThang 9}
{SET m{=MOD(ABS({DATE \@ M}+KhoangThoiGianTheoThang+11);12)+1}}
{SET y{=INT({DATE \@ yyyy}+(KhoangThoiGianTheoThang+{DATE \@ M}-1)/12)}} {SET a{=INT((14-m)/12)}}
{SET b{=y+4800-a}} {SET c{=m+12*a-3}}
{SET d{=IF(({DATE \@ d}>28+((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0)))*(m=2)=1;29+((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0));{DATE \@ d})}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)-32045- 1}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
Chủ nhật,32 14/03/2010}
Thứ hai, 01/11/2010
f) Chỉ ra ngày tháng năm cách KhoangThoiGianTheoNgay n ngày
{QUOTE
{SET KhoangThoiGianTheoNgay 14} {SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045+KhoangThoiGianTheoNgay}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}
Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ hai, 01/11/2010
g) Chỉ ra ngày tháng năm cách KhoangThoiGianTheoTuan n tuần
{QUOTE
{SET KhoangThoiGianTheoTuan 43} {SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045+INT(KhoangThoiGianTheoTuan*7)}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}
Thứ hai, 01/11/2010
h) Chỉ ra ngày làm mốc, cách bao nhiêu ngày nữa thì hết tháng hiện tại
Trên thực tế có những thời điểm làm mốc trong tháng, ví dụ trước khi hết tháng hiện tại 3 ngày phải nộp báo cáo, ngày đó tạm coi như ngày làm mốc. Viết tự động ngày làm mốc cho hàng tháng thông qua các trường của Word như sau:
{QUOTE
{SET KhoangThoiGianCachMayNgay 3} {SET yy{DATE \@ yyyy}}
{SET mm{DATE \@ M}}
{SET dd{=MAX(1;IF((mm=2);28+(MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0);IF((mm=4)+(mm=6)+(mm=9)+(mm=11)+({DATE \@ d}>30)=1;30;31))-KhoangThoiGianCachMayNgay)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}} Muốn biết ngày cuối cùng của tháng hiện tại thì thay KhoangThoiGianCachMayNgay=0
Muốn chỉ ra cách 1 tuần nữa thì hết tháng hiện tại, đặt KhoangThoiGianCachMayNgay=7
Ở đây nếu chỉKhoangThoiGianCachMayNgay > số ngày trong tháng, thì coi như ngày làm mốc là ngày mồng 1 luôn.
Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ năm, 25/02/2010
i) Tính ngày của tháng kế cách mấy tuần và ngày thứ mấy
Giả sử từ ngày hiện tại là ngày 22 tháng 02 năm2010, muốn tìm ngày thứ hai thuộc tháng kế tiếp cũng thuộc tuần như tháng này + tuần chênh thêm.
{QUOTE
{SET NamHienTai{DATE \@ yyyy}} {SET Thang{={DATE \@ M}+1}} {SET TuanChenhThem 2} {SET NgayThuMayTrongTuan 0} {SET a{=INT((14-MOD(Thang+11;12)-1)/12)}} {SET b{=NamHienTai+4800-a+INT(Thang/13)}} {SET c{=MOD(Thang+11;12)+1+12*a-3}} {SET jd{=1+INT((153*c+2)/5)+365*b+INT(b/4)- INT(b/100)+INT(b/400)-32045}} {SET GioiHan{=IF((Thang=2);28+((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0));IF((Thang=4)+(Thang=6)+(Thang=9)+(Thang=11 )=1;30;31))}} {SET jd{=INT(jd/7+MAX(TuanChenhThem- 1;0))*7+NgayThuMayTrongTuan+(INT(jd/7)*7+NgayThuMayTrongTua n<jd)*7-((INT(jd/7+TuanChenhThem- 1)*7+NgayThuMayTrongTuan+(INT(jd/7)*7+NgayThuMayTrongTuan< jd)*7>jd+GioiHan-1)*INT((INT(jd/7+TuanChenhThem- 1)*7+NgayThuMayTrongTuan+(INT(jd/7)*7+NgayThuMayTrongTuan<
jd)*7-(jd+GioiHan))/7+1)*7)}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật” {IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}} Khi đặt TuanChenhThem=2, NgayThuMayTrongTuan=0 (Thứ hai) sẽ tính được đó là ngày Thứ năm, 25/02/2010
Chú ý: Giá trị trong {SET NgayThuMayTrongTuan 0} xác định ngày của tuần trả về (0=Mon, 1=Tues, 2=Wed, 3=Thurs, 4=Fri, 5=Sat, 6=Sun), trong khi giá trị ở {SET TuanChenhThem 1} cho phép mô tả tuần của tháng. Biến ‘GioiHan’ được dùng để ngăn ngừa việc chọn ngày vượt quá số ngày của tháng. Điều này nghĩa là nếu đặt biến TuanChenhThem là 5 sẽ luôn trả về tuần cuối cùng của tháng.
Để cố định trường cho 1 tháng đặc biệt, thay đổi dòng
‘{SET Thang {={DATE \@ M}+1}}’ thành ‘{SET Thang #}’,ở đây # là tháng ghi rõ. Ví dụ‘{SET Thang 3}’ sẽ trả về 1 ngày trong tháng 3.
j) Chỉ rõ ngày làm việc cuối hoặc đầu tuần cách KhoangThoiGianTheoThang n ngày
Thực tế khi tính một ngày cách ngày hiện tại n ngày. Thế nhưng nếu như bình thường, ngày cần tính là ngày làm việc thì đúng là n ngày, nhưng nếu ngày cần tính lại rơi vào ngày nghỉ thứ bảy hay chủ nhật thì phải lùi lại trước đó vào thứ sáu, hoặc qua ngày thứ hai. Như vậy, thực tế sẽ không phải n ngày mà sẽ dao động thêm khoảng một đến hai ngày nữa, chính vì vậy phải chỉ ra ngày làm mốc để phấn đấu hoàn thành công việc trước ngày đó, chứ không tính n ngày nữa. Khi muốn chỉ rõ các ngày cuối tuần (thứ, ngày) làm việc, kế sau ngày hiện tại n ngày sử dụng code sau:
Trước thứ sáu, nếu ngày làm mốc rơi vào ngày nghỉ: {QUOTE
{SET KhoangThoiGianTheoNgay 10} {SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}}
{SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045+KhoangThoiGianTheoNgay}}
{SET jd{=jd+(MOD(jd;7)>4)*(4-MOD(jd;7))}} {SET e{=INT((4*(jd+32044)+3)/146097)}}
{SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}.
Đặt KhoangThoiGianTheoNgay=10, kể từ ngày hôm nay là ngày 22 tháng 02 năm 2010 thì sẽ là ngày Thứ năm, 25/02/2010.
Sau ngày thứ hai, nếu ngày làm mốc rơi vào ngày nghỉ sẽ là: {QUOTE
{SET KhoangThoiGianTheoNgay 10} {SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045+KhoangThoiGianTheoNgay}} {SET jd{=jd+(MOD(jd;7)>4)*(7-MOD(jd;7))}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}
{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}
{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”
{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}
{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}.
Đặt KhoangThoiGianTheoThang=10, kể từ ngày hôm nay là ngày 22 tháng 02 năm2010 thì sẽ là ngày Thứ năm, 25/02/2010.