สงสัยเรื่องวันที่ จนปัจจุัับันก็ยังงงอยู่
กระทู้เก่าบอร์ด อ.Yeadram

 9,715   21
URL.หัวข้อ / URL
สงสัยเรื่องวันที่ จนปัจจุัับันก็ยังงงอยู่

เรียนท่านผุ้รู้และอาจารย์ทุก ๆ ท่าน

ในเครื่อง Control Panel, Regional Setting ตั้งเป็น dd/mm/yyyy (ปีคริสตศักราช 2011)...

แต่เมื่อทำ Access, โดยสร้างฟอร์ม, Combo Box เปล่า ๆ, Row Source ให้เลือก tbl กับฟิลด์วันที่ตามข้อมูลในฟิลด์นั้นคือ 05/12/2011 (วว/ดด/ปปปป), และมีคำสั่ง Command Button (VBA Code) เพื่อไปสั่งให้นำวันที่ ๆ เลือกไปทำที่ query, แต่พอไปเปิดดูใน query แล้ว, วันที่กลายเป็น 12/05/2011 (ดด/วว/ปปปป)

มีวิธีแก้ไหมครับ, และที่เป็นเช่นนี้เพราะอะไรครับ

ขอบพระคุณล่วงหน้าครับ

21 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R10797
ถ้าหมายถึงว่าคุณไปเปิดดูใน SQL View ของคิวรี่แล้วหล่ะก็ ไม่ต้องห่วงครับ มันจะเป็นอย่างนั้น ไม่ว่า Regional Setting ของ Windows จะกำหนดรูปแบบวันที่ของเครื่องเป็นอะไรก็ตาม แต่ถ้าไปดูใน Design View แล้วหล่ะก็ มันจะเป็นไปตามที่กำหนดใน Regional Setting ครับ

ถ้าถามว่าทำไมถึงเป็นอย่างนั้น ผมก็เข้าใจเอาเองว่า เพราะ SQL ที่เราดูเป็นเท็กซ์ อย่างที่เห็นใน SQL View นั้น มันเป็นข้อความที่เก็บไว้จริงๆทุกตัวอักษรตามนั้น ดังนั้นข้อความนี้จะต้องถูกตีความออกมาได้เหมือนๆกันไม่ว่าจะนำไปใช้ที่เครื่องไหนก็ตาม เลยจำเป็นต้องกำหนดรูปแบบตายตัวว่า ถ้าระบบไม่แน่ใจว่ามันเป็น วว/ดด/ปปปป หรือ ดด/วว/ปปปป กันแน่ เช่น #12/01/2011# ก็ให้ยึดว่าต้องเป็น ดด/วว/ปปปป เท่านั้น แต่ถ้าสามารถตีความออกมาได้อย่างเดียวอยู่แล้ว เช่น #13/1/2011# แม้จะไม่อยู่ในรูปแบบของ ดด/วว/ปปปป มันก็ยอมให้ใช้ได้เช่นกัน
2 @R10798
Set Format วันที่ ใหม่ ครับ

โดยใช้คำสั่ง CONVERT ครับ
3 @R10813
คุณ Teerapat หรือ อ. ท่านอื่น ๆ โปรดช่วยแนะรายละเอียดด้วยครับ, มือใหม่ครับ, งง งง ครับ, (ขออภัยหากให้ต้องอธิบายละเอียด), ทำอย่างไรครับ Convert
4 @R10820
เอางี้แล้วกัน

ง่ายๆ เลย

เวลา บันทึกวันที่ หรือ จะใช้ วันที่ อะไรก็แล้วแต่

ใช้ เป็น แบบ Long ครับ
จะได้ไม่งง และไม่ยุ่งยากครับ
5 @R10822
หรือว่าทำเป็นแบบนี้เพื่อให้เข้าใจง่าย ไม่ทราบว่าจะเป็นผลใด, อะไรหรือไม่ครับ (ความรู้และความเข้าใจน้อยครับ)

(1.) control Panel, Regional Setting กำหนดเป็น Thai,
       Calendar type - คริสต์ศักราช,
       Short Date - 27/08/2011,
       Long date - 27 สิงหาคม 2011

(2) ใน table ฟิลด์ใดที่เป็นวันที่ กำหนด format - Long Date (ข้อมูลในฟิลด์จะ
     แสดงเป็น "27 สิงหาคม 2011" (ขอยืมความรู้จาก อ. Teerapat, ไม่ทราบว่าจะเข้าใจตรงกันหรือไม่ครับ)

(3) ใน query เมื่อแสดงข้อมูลออกมาก็จะเป็น "27 สิงหาคม 2011" แต่เมื่อกำหนด criteria เพื่อเลือกข้อมูลจะ้ต้องกำหนดเป็น #27/08/2011# (ไม่ทราบว่าเพราะอะไรต้องกำหนดเดือนเป็นตัวเลข ???)

(4) ใน query สร้างฟิลด์เพิ่ม 1 ฟิลด์, ใส่คำสั่ง DateAdd +543, (ขอยืมความรู้จาก อ.Yeadram ที่เคยให้มาครับ) ให้ฟิลด์นั้นกลายเป็นปี พ.ศ. ครับ, ผลที่ได้คือ "27/08/2554"

ก็ง่าย ๆ อย่างนี้ครับ
ข้อความอาจารย์สันติสุขนั้น สูงครับ ผมไม่ค่อยเข้าใจหรอกครับ

"Set Format วันที่ ใหม่ ครับ, โดยใช้คำสั่ง CONVERT ครับ" ผมทำไม่เป็นครับ


6 @R10823
แล้วที่บอกว่าแสดงออกมาเป็น ดด/วว/ปป .. มันแสดงตรงขั้นตอนไหนครับ แสดงที่ตำแหน่งไหน และแสดงออกมาเป็นค่าอะไรครับ

ปล. 27/8/2554 Access มันจะเข้าใจว่าเป็นปี ค.ศ. 2554 นะครับ ไม่ใช่ พ.ศ. 2554 ตรงนี้ทำความเข้าใจให้ถูกต้องด้วย ดังนั้นต้องระีวังวันที่ 29 กพ.ไว้ให้ดี เพราะเมื่อทำวิธี DateAdd + 543 แล้ว มันอาจไม่ให้วันที่ 29 กพ. ก็ได้ แต่อาจให้ 1 มี.ค. แทน เพราะปีที่บวก 543 นั้นอาจไม่มีวันที่ 29 กพ.
7 @R10824
Form, Combo Box, Row Source, กดปุ่มขวาสุด, ดึงตาราง, เลือกฟิลด์วันที่มา 1 ฟิลด์, คลิีกปิด, Yes

มาที่ Form ใน combo box เลือกวันที่ก็แสดงเป็น วว/ดด/ปปปป, กดปุ่ม OK (Command button - Code VBA SQL สร้างเงื่อนไข criteria วันที่กับ query)
เมื่อไปเปิดดูใน query, criteria, เป็น ดด/วว/ปปปป

ผมตั้ง, กำหนด, เข้าใจอะไรผิดหรือเปล่าครับ ???

--------------------------
ผมทำวิธี DateAdd +543 กับ 27/08/2011 ซึ่งให้ผลเป็น 27/08/2554,
จะต้องระวังกับเดือน ก.พ. ตามที่อาจารย์สันติสุขแจ้งมาด้วยหรือครับ
ไม่รู้จริง ๆ ครับ

เพราะผมเวลาใช้เลือกข้อมูลจะใช้จากฟิลด์ที่เป็น 27/08/2011 (ซึ่งความเข้าใจผมเข้าใจว่า อย่างไรเดือนก.พ. ก็มี 28 หรือ 29 วันตามปีนั้น ๆ) แต่ที่เป็นฟิลด์ 27/08/2554 สำหรับแสดงข้อมูลออกทางรายงานน่ะครับ

อ้อ...หรือจะใช้อีกวิธีก็ได้ เช่น หากให้รายงานแสดงเป็นปี พ.ศ. ก็นำฟิลด์ปี ค.ศ. ไปแสดงออกและใช้คำสั่ง DateAdd +543 ไ้ด้หรือไม่ครับ



8 @R10825
ตรงนี้แหล่ะที่ผมไม่เข้าใจ ... "Code VBA SQL สร้างเ งื่อนไข criteria วันที่กับ query" คุณเขียนโค้ดไว้ยังไง เอาโค้ดมาให้ดูหน่อยครับ

และอีกจุดคือ "เมื่อไปเปิดดูใน query" คุณไปเปิดใน Design View ใช่ไหม ? (ไปดูที่เมนู View บรรทัดที่เขียนว่า Design View จะถูกเลือกไว้หรือไม่ หรือว่าอะไรที่ถูกเลือกแทน Design View)

-----

dateadd("yyyy",543,#29-Feb-2008# ) = 28/02/2551 ครับ ไม่ใช่ 29 ไปลองดูครับ
9 @R10827
ที่ผมใช้ ผมใช้ คำสั่ง Format(dateField, "YYYYmmDD") ทุกครั้งที่ประมวลผลในเรื่องของวันที่

ส่วนเวลา Show ต่างๆ ผมใช้คำสั่ง Format(dateField,"dd mmmm yyyy")

ถ้าเป็น   Aceess Project ใช้ คำสั่ง Convert(varchar,datefield,113) สำหรับ ประมวลผล

ถ้าเป็น Show ต้องทำ Function เพิ่ม ไม่งัน มันจะ โชว์ เป็น 28 Aug 2011 อย่างที่ คุณ TWIN เจอ นะครับ
10 @R10860
เรียน อาจารย์สันติสุข ที่กรุณา
    ผมขอไปหาโค้ดก่อน (เพราะเยอะมาก,ต้องไปหาครับ) และจะนำตัวอย่างมาแจ้งให้อาจารย์อีกครั้งในกระทู้นี้น่ะครับ, ขอบคุณครับ
    อาจารย์อย่างไรอย่าลืมดูกระทู้นี้น่ะครับ "สงสัยเรื่องวันที่ ปัจจุบันก็ยังงงอยู่"
11 @R10873
เรียน อาจารย์สันติสุข

    ตามที่จะส่งโค้ดให้อาจารย์ดูน่ะครับ, ผมแนบไฟล์ไว้ใน accboard@gmail.com ไว้ด้วยอีกทางหนึ่ง และแจ้งไว้ทางบอร์ดนี้ด้วยครับ
(พอดีพึ่งกลับจากต่างจังหวัดครับ)



โปรดสังเกตุจากรูปน่ะครับ, ใน frm_FindDate เลือกวันที่ 04/01/2554 และ 06/04/2554, แต่ใน qry_FindDate แสดงออกเป็นวันที่ 01/04/2554 และ 04/06/2554 ครับ

ไม่ทราบว่าผมระบุโค้ดผิดจุดไหน,หรือไม่ครบถ้วน, หรือจะแนะนำ,แก้ไขก็ได้ครับ

ขอบพระคุณล่วงหน้าอย่างสูงครับ
12 @R10874
ดูโปรแกรมให้แล้วนะครับ สาเหตุก็เป็นไปตามที่ผมตอบไว้ตั้งแต่คำตอบแรกนั้นแหล่ะครับ โค้ดที่รับวันที่มาจากฟอร์ม และนำไปสร้างเป็นคิวรี่นั้นคือ

Private Sub cmd_Detail_Click()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim dateStart As Date
    Dim dateEnd As Date
    Dim strSQL As String
    Set db = CurrentDb
    Set qdf = db.QueryDefs("qry_FindDate")
    dateStart = Me.cboStartDate
    dateEnd = Me.cboEndDate
             strSQL = "SELECT tbl_FindDate.* " & _
             "FROM tbl_FindDate " & _
             "WHERE tbl_FindDate.DateSentCom between #" & dateStart & "#" & " And #" & dateEnd & "#" & _
             "ORDER BY tbl_FindDate.DateSentCom;"
    qdf.SQL = strSQL
    DoCmd.OpenQuery "qry_FindDate", acViewNormal
    Set qdf = Nothing
    Set db = Nothing
End Sub

เมื่อใดก็ตามที่คุณเขียนถึงวันที่ใน SQL Statement โดยตรง (เช่นอย่างในโค้ดนี้ หรือการไปเขียนใน SQL View ของคิวรี่ [ภาพที่คุณแสดงให้ดูนั้นคือ Design View ของคิวรี่]) และวันที่นั้นไม่สามารถระบุได้อย่างแน่ชัดว่าเป็น วว/ดด หรือ ดด/วว (เช่นเขียนว่า #01/02/2011# ถ้าคุณเป็นตัว DAO หรือ ADO ซึ่งเป็นตัวจัดการฐานข้อมูลที่ Access ใช้ คุณจะรู้ได้อย่างไรว่า มันเป็น 1 กุมภา หรือ 2 มกรา ???) ดังนั้นข้อกำหนดที่มันตั้งไว้ก็คือ เมื่อเขียนในรูปแบบ #99/99/9999# มันจะตีความออกมาเป็น #ดด/วว/ปปปป# ไม่ว่าขณะนั้นคุณจะใช้ Windows ของประเทศไหน ตั้ง Regional เป็นอะไรก็ตาม ดังนั้น SQL Statement ที่มี #04/01/2554# (ปีค.ศ.2554) และ #06/04/2554# (ปีค.ศ.2554) มันจะตีความว่าเป็น วันที่ 1 เมษายน และ วันที่ 4 มิถุนายน แต่เมื่อเปิดดูใน Design View (ตามรูป) มันจะแสดงออกมาตาม Regional ที่กำหนดไว้ ก็ได้เป็น 01 วว /04 ดด /2554 คศ และ 04 วว /06 ดด /2554 คศ

ซึ่งทั้งหมดนั้นมันตรงกันข้ามกับที่คุณคิดว่า คุณสร้าง SQL Statement ด้วย วว/ดด/ปปปป แล้วมันแสดงใน Design View เป็น ดด/วว/ปปปป

สรุปคือ มันทำงานถูกต้องแล้ว

แล้วต้องทำอย่างไรเพื่อกำจัดปัญหานี้ ... ผมเองใช้วิธีแปลงวันที่ที่ใส่เข้าไปใน SQL Statement ให้เป็นรูปแบบ วว/ชื่อเดือนในภาษอังกฤษ/ปปปป เช่น #04/Jun/2011# ดังนั้น ไม่ว่าจะตีความออกมาอย่างไร มันก็จะต้องตีความได้ถูกต้องเสมอครับ
13 @R10875
โค้ดก็จะเป็น between #" & format(dateStart,"dd/mmm/yyyy") & "#" & " And #" & format(dateEnd,"dd/mmm/yyyy") & "#"
14 @R10877
เรียนอาจารย์สันติสุข

ผมระบุเพิ่มตามที่อาจารย์แนะแล้วครับ, ฟ้อง error ตามรูปครับ

เหมือนกันว่าจะฟ้อง systax error นะครับ

15 @R10880
อ๋อ เพราะใน regional กำหนดวันที่เป็นภาษาไทย มัีนเลยตีความไม่ออก ชื่อเดือนต้องเป็นภาษาอังกฤษครับ ถ้าอย่างนี้คงต้องเขียนฟังก์ชั่นขึ้นมาเพื่อให้มันแปลงออกมาในรูป วว/เดือนภาษาอังกฤษ/ปปปป แทน format(...) ครับ

เช่น
Public Function ddmmmyyyy(DT as date) as string
   Dim m(12) as string

   m(1) = "Jan"
   m(2) = "Feb"
   ...
   ...
   m(12) = "Dec"

   ddmmmyyyy = day(DT) & "/" & m(month(DT)) & "/" & year(DT)
End Function

แล้วโค้ดก็เปลี่ยนนิดหน่อยเป็น
between #" & ddmmmyyyy(dateStart) & "#" & " And #" & ddmmmyyyy(dateEnd) & "#"
16 @R10881
อีกอย่างคือในเรื่องของปีว่ามันตีความเป็น พ.ศ. หรือ ค.ศ. กันแน่ ถ้าใน regional กำหนดเป็นปี พ.ศ. ปีที่แสดงออกมาก็เป็น พ.ศ. ด้วยเช่นกัน แม้ว่าจะเป็นตัวเลข 2011 แต่มันก็คือ พ.ศ. 2011

ในทำนองเดียวกัน ถ้า regional กำหนดเป็น ค.ศ. แแม้ว่าที่เห็นคือตัวเลข 2554 แต่มันก็คือ ค.ศ. 2554 นะครับ
17 @R10882
พอดีเปิดเข้ามา,เห็นอาจารย์มาโพสเลยไปลองดู
ได้แล้วครับ
(โล่งอกไปเลยครับ)
ขอบคุณครับ ๆ ๆ
18 @R10883
     กำลังลุ้นอยู่ครับสำหรับหัวข้อนี้
ในที่สุดก็ปิดกระทู้ซักที ....
19 @R10886
ต่อ ๆ ...

คุณ U&ME มีวิธีอื่นมากกว่านี้ไหมครับ...(ทางเลือกอื่น ???)

เช่น ตั้งใน control panel ปี พ.ศ. และเมื่อ Key in ฟอร์มที่สร้างเป็นปี พ.ศ.
การใช้งานเป็นปี พ.ศ. ล้วน(ไม่เกี่ยวข้องปี คริสต์ศักราชเลย)...ฯลฯ

???
20 @R10888


ถ้าคุณตั้งค่าใน Regional Options เป็นรูปแบบใด ๆ คุณก็ต้องป้อนใน Ms Access แบบนั้น {ตามรูปเป็นการจัดรูปแบบเป็นแบบ English(United States) สังเกตที่ Short Date มีค่าเป็น 9/3/2011 กรณีนี้ถ้าไม่รู้ว่า "9" หมายถึง "กันยายน" หรือ "วันที่ 9" ก็ให้ดูที่ Long date เทียบเอา} เมื่อทำการป้อนค่าตัวควบคุม (ตัวอย่างของคุณคือ ComboBox ก็ต้องป้อนค่า เดือน/วัน/ปี ตามการตั้งค่าใน Regional Options

(ดูรูปเล็กอันแรก) สังเกตในส่วนของปีจะแสดงเป็นปี ค.ศ. แต่รูปแบบวันเรียงเป็น วว/ดด/ปป เพราะผมกำหนดตารางให้เก็บเป็น วว/ดด/ปป (ก็ควรกำหนดตามความเข้าใจของผู้ใช้ส่วนใหญ่)

(ดูรูปเล็กอันที่สอง) เมื่อเปลี่ยน Regional Options เป็น Thai สังเกตว่าส่วนของปีจะแสดงเป็นปี พ.ศ. รูปแบบวันก็ยังเรียงเป็น วว/ดด/ปป เหมือนเดิม

*** ทีนี้ก็เป็นส่วนสำคัญในการคำนวณค่าวันที่ใน SQL และ VBA ทั้งสองตัวนี้จะคำนวณรูปแบบวันเป็น ดด/วว/ปป โดยอัตโนมัติ เพราะงั้นตอนส่งค่าพารามิเตอร์ให้กับ Query คุณจะทำยังไงก็ได้ให้ส่งไปเป็นแบบ ดด/วว/ปป
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2803s