PDA

View Full Version : รบกวนขอสอบถามเกี่ยวกับเรื่องการแสดงวันเดือนปี



seal_true
5 Jan 2012, 09:29
ผมรบกวนขอสอบถามเรื่องการแสดงผลของอายุของอุปกรณ์ โดยให้แสดงผลเป็น ปี เดือน วัน เช่น ซื้อวันที่ 01/01/2011 หาอายุ ณ วันที่ 02/02/2012 จะเท่ากับ 1 ปี 1 เดือน 1 วัน ไม่ทราบว่าผมจะต้องเขียนสูตรอย่างไร (โดยการแสดงผลนั้น ถ้าไม่ถึง ปี ให้แสดงผลแค่ เดือน วัน , ถ้าไม่ถึง เดือน ให้แสดงผลแค่ วัน)
** ขออภัยด้วยครับ ที่ผมไม่ได้แนบไฟล์มาให้ เนื่องจาก ไม่ทราบว่าจะเขียนอย่างไร **

bank9597
5 Jan 2012, 11:10
:smile: ยังไงแนบไฟล์มาครับ ทำโจทย์และคำตอบที่ต้องการมาให้เห็น เพื่อความสะดวกในการตอบครับ

คำถามดังกล่าวใช้ สูตร Datedif ได้ครับ ยกตัวอย่างเช่น

A1 = 01/01/2011
B1 = 02/02/2012
C1 คีย์สูตร =DATEDIF(A1,B1,"Y")&" ปี "&DATEDIF(A1,B1,"YM")&" เดือน "&DATEDIF(A1,B1,"MD")&"วัน"

คำตอบที่ได้ก็จะเป็น 1 ปี 1 เดือน 1วัน

seal_true
5 Jan 2012, 11:58
ขอบคุณมากครับคุณ bank9597 ตอนนี้ผมใช้สูตร Datedif และทำได้แล้วครับ

bank9597
5 Jan 2012, 12:16
:smile: ยินดีด้วยครับ

แต่ตามที่คุณบอกว่า
ถ้าไม่ถึง ปี ให้แสดงผลแค่ เดือน วัน , ถ้าไม่ถึง เดือน ให้แสดงผลแค่ วัน

ตรงนี้ผมไม่สามารถแนะนำได้ครับ

ส่วนอีกอย่างหนึ่ง สูตร Datedif ถึงแม้จะให้คำตอบตรงที่เราต้องการก็จริง แต่ก็อาจจะไม่ถูกต้องเสมอไป เพราะแต่ละปีนั้น จำนวนวันไม่ได้เท่ากันตลอด ผู้รู้หลายท่านจึงไม่แนะนำให้ใช้ แต่ถึงกระนั้นแม้แต่ทีมผู้สร้างโปรแกรมเอง ก็ยังไม่สามารถแก้ไขจุดบกพร่องนี้ได้ การใช้สูตร Datedif ก็ถือว่าให้คำตอบที่ใกล้เคียงความเป็นจริงมาที่สุดแล้วล่ะครับ :cool:

seal_true
5 Jan 2012, 13:06
ตอนนี้ผมก็กำลังประสบปัญหาในส่วนนี้อยู่เหมือนกันครับ แต่ก็พยายามหาแนวทางอื่นอยู่เหมือนกันครับ ถ้าทำได้ยังไง จะส่งข้อมูลไปให้ช่วยตรวจสอบอีกครั้งครับ

tradtrae
5 Jan 2012, 13:48
:smile: ยังไงแนบไฟล์มาครับ ทำโจทย์และคำตอบที่ต้องการมาให้เห็น เพื่อความสะดวกในการตอบครับ

คำถามดังกล่าวใช้ สูตร Datedif ได้ครับ ยกตัวอย่างเช่น

A1 = 01/01/2011
B1 = 02/02/2012
C1 คีย์สูตร =DATEDIF(A1,B1,"Y")&" ปี "&DATEDIF(A1,B1,"YM")&" เดือน "&DATEDIF(A1,B1,"MD")&"วัน"

คำตอบที่ได้ก็จะเป็น 1 ปี 1 เดือน 1วัน






ผมเพิ่ม IF เข้าไป เพื่อที่ว่า ถ้่าได้ 0 ปี หรือ 0 เดือน ค่าปี และ เดือน น่าจะไม่ต้องแสดง โดยใช้สูตรดังนี้

=IF(DATEDIF(A1,B1,"Y") > 0, DATEDIF(A1,B1,"Y") &" ปี ",) & IF(DATEDIF(A1,B1,"YM") > 0, DATEDIF(A1,B1,"YM")&" เดือน ",) & DATEDIF(A1,B1,"MD")&"วัน"

seal_true
5 Jan 2012, 14:36
ขอบคุณครับ คุณ tradtrae ผมได้ใช้ IF เช่นกัน แต่ปรับปรุงสูตรใหม่ จะต่างกันที่ วัน ครับ ดังนี้
=IF(DATEDIF(A1,B1,"Y")>0,DATEDIF(A1,B1,"Y")&" ปี ",)&IF(DATEDIF(A1,B1,"YM")>0,DATEDIF(A1,B1,"YM")&" เดือน ",)&IF(DATEDIF(A1,B1,"MD")>0,DATEDIF(A1,B1,"MD")&" วัน","")

เพราะจากการที่ลองทำ ตามที่คุณ tradtrae ให้มา เมื่อไหร่ วันที่จะหาอายุตรงกับ วันที่เริ่มต้น จะทำให้ เป็น 0 วัน และ สูตร If จะไม่ทำงานครับ
ตามแนบครับ (ยังคงโชว์ 0 วัน) และเท่าที่ลองทำดูยังไม่พบความผิดปกติ (ทดสอบ วันที่ 29/02/2012 เทียบกับ วันที่ 29/02/2016)

bank9597
5 Jan 2012, 15:02
:smile: จากสูตร
=IF(DATEDIF(A1,B1,"Y")>0,DATEDIF(A1,B1,"Y")&" ปี ",)&IF(DATEDIF(A1,B1,"YM")>0,DATEDIF(A1,B1,"YM")&" เดือน ",)&IF(DATEDIF(A1,B1,"MD")>0,DATEDIF(A1,B1,"MD")&" วัน","")

สามารถใช้งานได้ครับ

ส่วนเรื่องที่จะทำให้จำนวนวันตรงกับความจริง เป็นเรื่องยากที่สุดแล้วล่ะครับ :cool:

สมเกียรติ
5 Jan 2012, 16:27
DateDif คำนวณค่าผิดในบางช่วง เช่น จาก 30/1/2012 - 1/3/2012
ควรจะได้คำตอบ 1 เดือน 2 วัน
แต่กลับหาคำตอบเท่ากับ 1 เดือนเท่านั้นครับ

แนะนำให้เปลี่ยนไปใช้ DateDiff Addin ของ John Walkenbach จะให้คำตอบถูกต้องกว่าครับ
http://www.excelexperttraining.com/extreme/files/timeplan/datetime.xls

seal_true
5 Jan 2012, 16:58
ขอบคุณครับ อาจารย์สมเกียรติ เบื้องต้นผมลองเปรียบเทียบวันที่ 30/01/2012 กับ 01/03/2012 ผลลัพท์ = 1 เดือน 2 วัน ครับ (แต่พอเปลี่ยนเป็นวันที่ 29/02/2012 กลับ = 28 วัน ** ไม่ยอมอ่านว่า 1 เดือน **) ผมเข้าใจว่าการใช้เงื่อนไขเกี่ยวกับวันที่นั้น เป็นอะไรที่ยุ่งยากมาก ตามที่คุณ bank9597 แนะนำ ซึ่งผมจะใช้ Datediff ในการสร้างข้อมูลแทนครับ , และจะลองหาวิธีอื่นๆมาทดลองทำครับ

ขอขอบคุณอีกครั้งครับ คุณ bank9597 ,คุณ tradtrae และอาจารย์สมเกียรติ

อรวีร์
5 Jan 2012, 17:28
การนับช่วงเวลาเป็น ปี:เดือน:วัน นั้นไม่น่าจะมี function ที่ได้ผลสมบูรณ์ได้
เนื่องจากแต่ละคนมีแนวความคิดในการสรุปผลที่อาจต่างกัน
เช่น 30/1/2012 - 1/3/2012 ควรได้ผลเป็น 1 เดือน 2 วัน
แต่พอลดวันสิ้นสุดลงหนึ่งวันเป็น 30/1/2012 - 29/2/2012 ควรจะได้ผลเป็น 1 เดือน 1 วัน
หรือควรจะได้ผลเป็น 1 เดือน 0 วันดีเพราะมกราคมมีถึง 31 วัน(DateDiff ได้ผลเป็น 1 เดือน 0 วัน)
และเมื่อลดวันเริ่มหนึ่งวันเป็น 29/1/2012 - 29/2/2012 DateDiff ก็ได้ผลเหมือนเดิมทั้งๆที่ข้อมูลเปลี่ยนไป
-----------
ในความคิดเห็นของอรวีร์ น่าจะใช้ผลแค่ ปี:เดือน
ลงย่อยถึงวันจะมีข้อโต้แย้งเยอะค่ะ

อรวีร์
5 Jan 2012, 17:34
การให้ได้ผลลัพท์เป็น ปี:เดือน อรวีร์ใช้ผลต่างออกมาเป็นจำนวนเดือนก่อนโดย
MonthDiff = 12x(ผลต่างปี) + ผลต่างเดือน
ผลลัพธ์เป็นปี:เดือน = Int(MonthDiff/12) & ":" & Mod(MonthDiff,12)