ย้อนหลังวันที่หลังเที่ยงคืน
กระทู้เก่าบอร์ด อ.Yeadram

 3,073   27
URL.หัวข้อ / URL
ย้อนหลังวันที่หลังเที่ยงคืน

คือผมได้ทำ Queries ไว้ เพื่อทำ Report ผมได้กำหนดเงื่อนไขไว้ตานนี้ครับคือ Between #7:00:00# And #19:00:00# ให้เป็นกะ A ส่วน
Between #19:01:00# And #23:59:59# Or Between #0:00:00# And #6:59:59# ให้เป็นกะ B
ยกตัวอย่างครับ
Between #19:01:00# And #23:59:59# เป็นช่วงเวลาวันที่ 21/6/2015 และ Between #0:00:00# And #6:59:59# จะเป็นวันที่ 22/6/2015
แต่ผมอยากให้ Between #0:00:00# And #6:59:59# นั้นยังคงเป็นวันที่ 21/6/2015 อยู่เหมือนเดิมครับ
จะเพิ่มเงื่อนไขหรือจะทำอย่างไรดีครับอย่างไรดีครับ

ขอบคุณครับ
paitoon

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

1 @R20658
Between #21/6/2015 19:01:00# And #21/6/2015 23:59:59# Or Between #21/6/2015# And #21/6/2015 6:59:59#
2 @R20665
ขอบคุณครับ แต่ผมยังไม่เข้าใจตรงวันที่ที่เพิ่มเข้ามาครับ ถ้าหลังเที่ยงคืนของวันที่อื่นๆ เพิ่มไปเลื่อยเราจะทำอย่างไรครับ เช่น
หลังเที่ยงคืน Between #0:00:00# And #6:59:59# จะเป็นวันที่ 23/6/2015 ผมอยากให้เป็นวันที่ 22/6/2015

หลังเที่ยงคืน Between #0:00:00# And #6:59:59# จะเป็นวันที่ 24/6/2015 ผมอยากให้เป็นวันที่ 23/6/2015

หลังเที่ยงคืน Between #0:00:00# And #6:59:59# จะเป็นวันที่ 25/6/2015 ผมอยากให้เป็นวันที่ 24/6/2015

ไปเลื่อนๆ ประมาณนี้ครับ

ขอบคุณครับ
3 @R20667
อ่านแล้วรู้สึก งง นะครับ คือถ้าคุณอ้างแค่เวลา คุณก็จะได้แค่เวลา 0:00:00 ถึง 23:59:59 ก็คือวันเดียวกัน โปรแกรมมันจะรู้วันได้ไงครับ แล้วการออกแบบข้อมูลคุณเป็นไงอะครับ คุณต้องหาวิธีอ้างวันด้วย

อธิบายเรื่องเวลาหน่อยนะครับ
- ค่าเวลาในโปรแกรม จริงๆแล้วสามารถทำให้ออกมาในรูปแบบของจำนวนทศนิยมได้ โดยการใช้ฟังก์ชั่น CDbl(#12:00:00 AM#) = 0
- ทุกๆ 1 วินาที คือการบวกจำนวน: 1.15740740740741E-05 (0.00001157407)
- ทุกๆ 1 นาที คือการบวกจำนวน: 6.94444444444445E-04 (0.00069444444)
- ทุกๆ 1 ชั่วโมง คือการบวกจำนวน: 4.16666666666667E-02 (0.04166666666)

12:00:00 AM = 0
01:00:00 AM = 4.16666666666667E-02 (0.04166666666)
02:00:00 AM = 8.33333333333333E-02 (0.08333333333)
03:00:00 AM = 0.125
04:00:00 AM = 0.166666666666667
05:00:00 AM = 0.208333333333333
06:00:00 AM = 0.25
07:00:00 AM = 0.291666666666667
08:00:00 AM = 0.333333333333333
09:00:00 AM = 0.375
10:00:00 AM = 0.416666666666667
11:00:00 AM = 0.458333333333333
12:00:00 PM = 0.5
01:00:00 PM = 0.541666666666667
02:00:00 PM = 0.583333333333333
03:00:00 PM = 0.625
04:00:00 PM = 0.666666666666667
05:00:00 PM = 0.708333333333333
06:00:00 PM = 0.75
07:00:00 PM = 0.791666666666667
09:00:00 PM = 0.875
10:00:00 PM = 0.916666666666667
11:00:00 PM = 0.958333333333333
- จะเห็นว่าเวลาตามที่คอมมองมันจะเป็นช่วงระยะระหว่าง 0 ถึง 1 ต่อ 1 วันเท่านั้น

สมมุติผมอยากทำโจทย์
05.00 - 12.00 = morning
12.00 - 18.00 = afternoon
18.00 - 21.00 = evening
21.00 - 05.00 = night

ก็สามารถเขียนแบบนี้แทนการเขียนเป็นเวลาได้เช่นกัน
    iTime = Time()
    If iTime >= 0.208333333333333 And iTime < 0.5 Then
        strSayHi = "Morning Time"
    ElseIf iTime >= 0.5 And iTime < 0.75 Then
        strSayHi = "Afternoon Time"
    ElseIf iTime >= 0.75 And iTime < 0.875 Then
        strSayHi = "Evening Time"
    Else
        strSayHi = "Night Time"
    End If

ดังนั้นถ้าคุณอ้างแค่เวลาคุณจะได้วันเดียวกันเสมออยู่แล้วนะครับ ถ้าคุณจะใช้แค่เวลาให้สามารถอ้างข้ามวันได้โดยไม่ต้องอ้างวันที่ ที่นึกออกก็ประมาณนี้ครับ
?#23:59:59# < timeserial(24,0,0) = True
4 @R20670
ขอบคุณครับสำหรับคำแนะนำครับ ผมขอทำความเข้าใจก่อนน่ะครับ
ขอบคุณครับ
5 @R20673


ผมได้แนบไฟล์รายงานที่ทำเป็นรูปภาพ เพราะผมอาจจะอธิบายไม่เข้าใจ ซึ่งมันจะมีเรื่องวันที่ต้องเอามาโชว์ที่รายงานด้วยน่ะครับ

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

Between DateValue([aTime])+#19:01:00# And DateValue([aTime])+#23:59:59# Or Between DateValue([aTime])+#0:00:00# And DateValue([aTime])+#6:59:59#

-ก็คืออ้างวันที่ในฟิลด์นั้นด้วยอะครับ อย่างที่บอกไว้ ประมาณนี้ครับ

7 @R20675
ขอแก้ข้อมูลนิดครับ เขียนผิดครับ เดี๋ยวคนที่สนใจเรื่องนี้จะเข้าใจคลาดเคลื่อน ข้างบนที่บอกว่า
- จะเห็นว่าเวลาตามที่คอมมองมันจะเป็นช่วงระยะระหว่าง 0 ถึง 1 ต่อ 1 วันเท่านั้น
แก้เป็น
- จะเห็นว่าเวลาตามที่คอมมองมันจะเป็นช่วงระยะระหว่าง 0 ถึง 0.999999... ต่อ 1 วันเท่านั้น

เพราะถ้าเป็น 1 คือ เป็นการนับวัน โดยสรุปคือ คอมพิวเตอร์จะวันที่เป็นจำนวนเต็ม เวลาเป็นทศนิยม เช่น
วันที่ (จำนวนเต็ม)
CDbl(#23/6/2015#) = 42178 (1 = วันที่ 31/12/1899)
เวลา (จำนวนทศนิยม)
CDbl(#16:34:00#) = 0.690277777777778

ดังนั้นการนำวันที่บอกเวลา
#23/6/2015# + #16:34:00#
ในทางคอมก็จะเป็นการบวกของ
42178 + 0.690277777777778 = 42178.690277777777778

เป็นคำตอบหากสงสัยว่าทำไมวันที่จึงจับมาบวกกับเวลาได้แบบตรงๆ
8 @R20677
ขอบคุณมากครับ แต่ยังติดปัญหาฟ้องเรื่อง Data type mismatch in criteria expression. อยู่ครับ คงจะออกแบบตารางเก็บข้อมูลของวันที่ผิด เดี่ยวผมของลองดูก่อนครับ จะแจ้งให้ทราบผมครับ

ขอบคุณครับ
9 @R20681
ผมได้ลองทำแล้ว และคิดก็ยังไม่ออก เพราะผมไม่ค่อยรู้เรื่องคำสั่งครับ มีแต่ดูเข้าแล้วมาดัดแปลงเอาเอง ตามความเข้าใจตัวเอง
ตอนนี้ผมได้ส่งข้อมูลให้ดูครับ ตั้งแต่การสร้าง ตาราง ทำ Queries และทำ Report ว่าผมทำถูกหรือเปล่า และอยากให้ช่วยหน่อยครับจะใช้วิธีไหนดี ถึงจะได้ข้อมูลออกมาตามที่ต้องการครับ

ขอบคุณครับ

10 @R20682
ลงผิดครับ ขอโทษครับ

ภาพนี้ส่วนผมสร้างตาราง
11 @R20683
ภาพนี้ส่วนผมทำ Queries แยกเป็น 2 กะทำงานมี กะ A และ กะ B

12 @R20684
13 @R20685
ภาพนี้ส่วนผมทำ Queries แยกวันที่เพื่อทำ Report
14 @R20686
ภาพนี้คือส่วน Report
15 @R20690
ขอแทรกหน่อย ถ้าเอาเวลาไปลบ 7 ชม.ก็จะได้วันที่ที่ต้องการ อย่างนี้ใช้ได้ไหม
16 @R20691
ที่บอกว่าลบ 7 ชม.หมายถึง หลังจากเที่ยงคืนเป็นต้นไป หรือ เวลา 00:00:00 น. ถึง เวลา 6:59:59 น. ใช้เปล่าครับ แล้วถ้าวันที่จะตรงกับวันที่ไหนครับ หรือรูปแบบจะเป็นอย่างไรครับ ผมยังไม่ค่อยเข้าใจเท่าไรครับ

เพราะผลลัพท์ที่อย่างไรคือ ถ้าช่วงเวลาหลังเที่ยงคืนหรือ เวลา 00:00:00 น. ถึง เวลา 6:59:59 น. อยากให้ยังเป็นวันที่ ของก่อนหน้า

หมายถึง ถ้าเวลา 19.01.00 น.- 23.59.59 น เป็นที่วันที่ 25
และถ้าเวลา 00:00:00 น. ถึง เวลา 6:59:59 น.จะเป็นเวลาปกติของเครื่องคือวันที่ 26 แต่ผมต้องการอยากให้ช่วงเวลาที่กำหนดนี้ยังคงเป็นวันที่ 25 อยู่ครับ

พอถึงช่วงเวลา 7.00.00 น. - 19.00.00 น. ก็ให้วันที่ปกติ คือวันที่ 26 วนกันไปอย่างนี้ครับ

ขอบคุณครับ
17 @R20692
@paitoon คือจริงๆ ตามตรรกะ ถ้าใช้
Between #19:01:00# And #23:59:59# เป็นช่วงเวลาวันที่ 21/6/2015 และ Between #0:00:00# And #6:59:59#
มันต้องได้วันเดียวกันอยู่แล้วนะครับ เพราะถ้าคุณอ้างแค่เวลา โปรแกรมจะมองว่า 0:00:00 ถึง 23:59:59 เป็นวันเดียวกันหมดอยู่แล้วนะ ง่ายๆ คุณลองสร้างฐานข้อมูลวันที่เวลา ทดสอบดู
สำหรับปัญหาเรื่องการข้ามวันนั้น คิดว่าก็คงอยู่ที่การออกแบบ
ผมคงแนะนำได้คราวๆเท่านั้นนะครับ เช่น
- ฟิลด์ที่คุณสั่ง
Between #19:01:00# And #23:59:59# เป็นช่วงเวลาวันที่ 21/6/2015 และ Between #0:00:00# And #6:59:59#
น่าจะต้องมีการจัดเก็บวันที่รวมอยู่ด้วย ไม่ควรแยกกัน เพราะมันจะมีปัญหาในการสร้างเงื่อนไขการกรองข้อมูลแบบนี้
- ในรูปเท่าที่เห็น คุณแยกจัดเก็บ วันที่ กับ เวลา ถ้าใช่ ลองสร้างฟิลด์รวมดู
Date_time: [Date] + [Time]
แล้วใช้ฟิลด์นี้ในการกำหนด
Between DateValue([aTime])+#19:01:00# And DateValue([aTime])+#23:59:59# Or Between DateValue([aTime])+#0:00:00# And DateValue([aTime])+#6:59:59#
ลองดูครับ

ปล. ผมแย่เรื่องการออกแบบและวิเคราะห์ฐานข้อมูลนะครับ แนะนำได้แต่แนวคิดกว้างๆ คงไม่กล้าแนะนำในส่วนนี้ กลัวเดี๋ยวจะไปกันใหญ่ ยังไงท่าน อ.สันติสุข มาแนะนำแล้ว ก็รบกวนท่านดูครับ
18 @R20694
ขอบคุณครับ ผมคงจะออกแบบตารางวันที่ผิดครับ
แต่ได้ลองสร้าง Date_time: [Date] + [Time]
แล้วใช้ฟิลด์นี้ในการกำหนด
Between DateValue([aTime])+#19:01:00# And DateValue([aTime])+#23:59:59# Or Between DateValue([aTime])+#0:00:00# And DateValue([aTime])+#6:59:59#
ตามที่แนะนำ ผลของวันที่และเวลาที่ออกมายังไม่ใช้คำตอบน่ะครับ
ขอบคุณครับ
19 @R20695
อีกอย่างครับลืมบอก อาจเป็นลักษณะของการออกแบบการบันทึกของคุณที่ออกแบบตามวันที่จริง (ซึ่งจะนับเวลาหลังเที่ยงคืนเป็นอีกวัน) แต่พอคุณต้องคำนวณกลับอยากได้เวลาหลังเที่ยงคืนเป็นวันเดียวกับก่อนเที่ยงคืน หรือป่าว
20 @R20696
ใช้เลยครับเข้าใจถูกต้องแล้วครับ คือผมออกแบบตามวันที่จริง
ผมทำให้พนักงานเป็นแบบยิง Barcode เข้าโปรแกรมครับ

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