PDA

View Full Version : สอบถามเรื่องการแปลงข้อมูลจากวันเป็นปี



seal_true
6 Mar 2008, 17:21
ขอสอบถามเรื่องการแปลงข้อมูลจากวันเป็นปีครับ เช๋น 1096 วัน เป็นกี่ปี โดยมีเงื่อนไขตรงตามปีจริงๆ เพราะปีนี้มี 366 วัน แต่ทั่วไปมี 365 วัน / ขอบคุณครับ

เอก
6 Mar 2008, 23:02
ถ้าจะให้มีเงื่อนไขตรงตามปีจริงๆ คุณก็ต้องมีวันที่จริงๆ เข้ามาเกี่ยวข้องด้วย เช่น 1096 วันของคุณน่ะ มันเริ่มนับจากวัน-เดือน-ปีไหน หรือนับถึงวัน-เดือน-ปีไหน ถ้ารู้วันที่ ก็สามารถหาได้ครับ ใช้ฟังก์ชัน DATEDIF ก็ได้

สมเกียรติ
7 Mar 2008, 10:23
ขอสอบถามเรื่องการแปลงข้อมูลจากวันเป็นปีครับ เช๋น 1096 วัน เป็นกี่ปี โดยมีเงื่อนไขตรงตามปีจริงๆ เพราะปีนี้มี 366 วัน แต่ทั่วไปมี 365 วัน / ขอบคุณครับ

ถ้านับจากวันนี้ไปอีก 1096 วัน นับได้ 1 ปี 0 เดือน กับ 1 วันครับ

ผมได้แนบแฟ้มเทียบสูตร Datedif ของ Excel กับ Datdiff (Function VBA) ของ www.j-walk.com/ss (http://www.j-walk.com/ss) มาให้ดูด้วยว่าผลต่างกัน

seal_true
7 Mar 2008, 12:49
ผมขอขอบคุณ คุณเอก , อาจารย์สมเกียรติด้วยครับ จากเรื่องยากกลายเป็นเรื่องง่ายเลยครับ

seal_true
7 Mar 2008, 13:51
ตอนนี้ผมสร้างข้อมูลแล้ว แต่พบว่าเกิดปัญหาคือ ถ้าผมทำสัญญากับลูกค้ารายหนึ่ง ให้มีวันเริ่มต้นทำสัญญา คือ 31-12-2007 แล้ว ให้สิ้นสุด 30-06-2008 ปรากฎว่า คำนวณได้ 5 เดือนกับ 30 วัน (ไม่ใช่ 6เดือนตามที่คิด)และลองทดสอบเปลี่ยนเป็นสิ้นสุด 31-07-2008 ผลลัพท์คือ 7 เดือน ซึ่งถูกต้อง
ลองทดสอบไปหลายรอบแล้ว พบว่า จะเพี้ยนเฉพาะเดือน มิ.ย. เท่านั้นครับ ผมไม่ทราบสาเหตุ รบกวนช่วยอธิบายด้วยครับ

สมเกียรติ
7 Mar 2008, 18:37
ปัญหานี้เกิดขึ้นเพราะหลักคำนวณที่ใช้ครับ คงต้องระวังหากจะใช้สูตร DateDiff/DateDif

ผมลองค้นหา DateDiff ใน VBA พบว่ามี function นี้อยู่แล้ว จึงลองสร้างสูตรใหม่ชื่อ DateDiffer มาให้ลองใช้กันครับ เท่าที่ดูจะหาคำตอบได้ 6 เดือนตรงตามที่ต้องการ แถมสูตรนี้ยังใช้หาช่วงระยะเวลาได้หลากหลายแบบ แต่จะคำนวณได้แค่ระยะเวลาสะสม ไม่สามารถนับปีชนปีแล้วนับเดือนที่เหลือได้แบบ DateDif

=DateDiffer(Date1,Date2,Interval)

seal_true
8 Mar 2008, 11:14
ขอบคุณครับอาจารย์สมเกียรติ

สมเกียรติ
8 Mar 2008, 13:29
น่าสังเกตว่า Microsoft ได้ตัดรายละเอียดของสูตร DateDif ออกไป จาก help ใน Excel ตั้งแต่รุ่น 2002 ทิ้งไปแล้ว และเว็บของ John Walkenbach ได้ตัด DateDiff add-in ออกไปด้วย จึงทำให้คิดว่าสูตรทั้งสองนี้ต้องมีอะไรที่ไม่ควรใช้อยู่เป็นแน่ หรืออาจเป็นเพราะใน VBA มีสูตร DateDiff อยู่แล้วจึงไม่จำเป็นต้องใช้สูตรนี้อีกใน Excel ก็เป็นได้ครับ

จึงขอตั้งข้อสังเกตไว้ให้พวกเราใช้กันอย่างระมัดระวัง :rolleyes:

ดูรายละเอียดเพิ่มเติมที่
http://www.j-walk.com/ss/excel/odd/odd03.htm
http://www.cpearson.com/excel/datedif.aspx

สมเกียรติ
10 Mar 2008, 14:26
ผมปรับสูตร DateDiff ของ John Walkenbach ในกรณีที่ชนสิ้นเดือนจะนับเพิ่มเดือนแทนเพิ่มวัน เช่น วันเริ่มต้นทำสัญญา คือ 31-12-2007 แล้ว ให้สิ้นสุด 30-06-2008 จะคำนวณได้ 6 เดือน

ฝากช่วยตรวจสอบครับด้วยว่ายังคำนวณไม่ตรงตามที่เราคิดตรงไหนอีกบ้าง



Option Explicit
Function DATEDIFF(d1, d2) As Variant
Dim YEARDIFF As Integer
Dim MONTHDIFF As Integer
Dim DAYDIFF As Integer
Dim temp As Date

temp = Time
' Swap arguments, if necessary
If d1 > d2 Then
temp = d1
d1 = d2
d2 = temp
End If
' Do the year part
YEARDIFF = Year(d2) - Year(d1)
If DateSerial(Year(d2), Month(d1), Day(d1)) > d2 _
Then YEARDIFF = YEARDIFF - 1

' Do the month part
If Month(d2) > Month(d1) Then
If Day(d2) >= Day(d1) Then
MONTHDIFF = Month(d2) - Month(d1)
Else
MONTHDIFF = Month(d2) - Month(d1) - 1
End If
Else
If Day(d2) >= Day(d1) Then
MONTHDIFF = Month(d2) - Month(d1) + 12
If MONTHDIFF = 12 Then MONTHDIFF = 0
Else
MONTHDIFF = Month(d2) - Month(d1) + 11
End If
End If
' Do the day part
If Day(d2) >= Day(d1) Then
DAYDIFF = Day(d2) - Day(d1)
Else
DAYDIFF = Day(DateSerial(Year(d1), _
Month(d1) + 1, 1) - 1) - Day(d1) + Day(d2)
End If
' Revised by Somkiat Foongkiat
' in case date1 > date2 and date2 is end of month
If Day(d1) > Day(d2) Then
If Day(d2) = Day(DateSerial(Year(d2), Month(d2) + 1, 0)) Then
DAYDIFF = 0
MONTHDIFF = MONTHDIFF + 1
End If
End If

If Day(d1) = Day(DateSerial(Year(d1), Month(d1) + 1, 0)) Then
If Day(d2) = Day(DateSerial(Year(d2), Month(d2) + 1, 0)) Then
DAYDIFF = 0
End If
End If

' Create the variant array to be returned
DATEDIFF = Array(YEARDIFF, MONTHDIFF, DAYDIFF)
End Function
'Further developed by Somkiat Foongkiat
Function YEARDIFF(d1, d2) As Integer
YEARDIFF = Application.Index(DATEDIFF(d1, d2), 1, 1)
End Function
Function MONTHDIFF(d1, d2) As Integer
MONTHDIFF = Application.Index(DATEDIFF(d1, d2), 1, 2)
End Function
Function DAYDIFF(d1, d2) As Integer
DAYDIFF = Application.Index(DATEDIFF(d1, d2), 1, 3)
End Function

seal_true
14 Mar 2008, 18:11
ขอบคุณอีกครั้งครับอาจารย์สมเกียรติ