ขอถามเรื่องการเรียงวันที่ค่ะ ชนิดข้อมูลตรงวันที่เบิกจ่ายเป็น nvarchar(50) ค่ะ ใช้ฐานข้อมูล ms sql server
type เป็น nvarchar ไม่ทราบว่าต้องการ sort string หรือ sort datetime ???
แม่เจ้าชื่อ column เป็นภาษาไทยด้วย ตอนทำไม่ทราบว่าปรึกษาใครหรือเปล่าครับ
Date :
2010-07-15 22:52:52
By :
tungman
ไม่ได้ปรึกษาใครเลยอ่ะค่ะ ว่างก็ฝึกทำเล่นๆ
จิงแล้ว ลองเขียนโปรแกรม vb.net แบบคลิกเลือกวันเดือนปีบนปฎิทินคะ
ตอนแรกก็ทำเป็นชนิดdatetimeแต่มันมีปัญหาเรื่องปีเยอะอ่ะค่ะมันเพี้ยนๆ เลยเปลี่ยนมาลอง stringดูว่าจะทำได้อ๊ะป่าว
Date :
2010-07-15 23:01:16
By :
ladyjupz
เพิ่งรู้ว่ามันยอมให้ตั้งชื่อภาษาไทยได้ด้วย ขอบคุณสำหรับความรู้ใหม่ครับ
Date :
2010-07-15 23:05:11
By :
PlaKriM
ยอมน่ะยอมค่ะ เพียงแต่ว่าตั้งชื่อ field เป็น unicode แบบนี้
ไม่ค่อยจะนิยมกันเท่าไหร่ น่าจะเป็นความชอบส่วนตัวแหละค่ะ
การใช้ date time ในกรณีจัดเก็บใน database แบบ charactor
ควรจะเก็บแบบ reverse และ fix-length ค่ะ
แล้ว reverse และ fix-length คืออะไร
นี่คือแบบปกติ 2-12-2010 หรือ d-m-yyyy เป็น format ที่มนุษย์เข้าใจ
แต่เครื่องจักรจะมองเป็น แถวของตัวอักษรไม่ได้ตีความเป็นวันที่
ส่วนแบบ R&F จะเป็นแบบนี้ 2010-12-02 หรือ yyyy-mm-dd
หากวันหรือเดือนไม่ครบสองตำแหน่งก็ให้ใส่เลขศูนย์นำหน้า
ฉะนั้นเมื่อนำมาเรียงข้อมูลจะได้ลำดับตามวันที่จริงๆ
แล้วทำไมต้องมายุ่งยาก คือต้องแปลงให้ตัว database engine เข้าใจอย่างที่ควรจะเป็น
ยกตัวอย่างในกรณีเครื่องคิดเลขที่เราต้องแปลง นิพจน์การบวกลบคูณหารแบบที่มุนษย์ใช้กัน
>> HUMAN EXPRESSION >> 2+(121/3) ให้กลายเป็น
>>REVERSE POLISH NOTATION >> 121,3,/,2+ ก็เพื่อจุดประสงค์เดียวกัน
คือให้เครื่องจักรประมวลผลได้อย่างถูกต้องค่ะ
ทั้งนี้ก้อเป็นคำแนะนำค่ะ จะเก็บแบบเดิมก็ไม่ได้ผิดอะไรเพียงแต่การ manage หรือ
ทำ query อาจจะเพี้ยนๆไป ยกตัวอย่างในกรณีที่คุณต้องการข้อมูลเป็นช่วงเวลา
จาก วันที่ 1 มค 2010 ถึง 15 มค 2010
ถ้าแบบ R&F จะเขียนคล้ายๆลักษณะนี้ค่ะ
SELECT * FROM [TableName]
WHERE [DateFieldWithinReverseAndFixLength] BETWEEN '2010-01-01' AND '2010-01-01'
และหากคุณต้องการความเร็ว ก็ให้ทำ index ซึ่ง index ก็จะทำงานได้อย่างถูกต้อง
ส่งผลให้ได้ความเร็วในการตอบสนองที่สุง
ส่วน แบบที่คุณใช้อาจจะยาวกว่านี้ค่ะ
แต่ถ้าคุณจะเขียนแบบนี้
WHERE [DateFieldWithinNormalFormat] BETWEEN '1/1/2010' AND '15/1/2010'
แบบนี้ วันที่ 2-9 จะไม่ออกมาด้วยค่ะ
ชอบแบบไหนก็เลือกตามอัธยาสัยค่ะ
แต่ถ้าจะให้แนะนำควรกลับไปใช้ datatype แบบ datetime โดยปกติน่ะดีแล้วค่ะ
เพราะเป็นมาตรฐานหากจะ แหกกฎออกไปแนะนำว่าควรเข้าใจกฎให้ดีก่อนค่ะ
ให้เดาว่าสาเหตุที่คุณใช้แบบ datetime แล้ว >> มีปัญหาเรื่องปีเยอะอ่ะค่ะมันเพี้ยนๆ
เลยเปลี่ยนมาลอง stringดูว่าจะทำได้อ๊ะป่าว
เดาว่าคุณคงเอาสตริงมาตัดต่อเข้ากับ sql statement ประมาณนี้
sqlStr = "SELECT * FROM [TableName] WHERE [DateFieldName] " & datetimePicker.SelectedDate.ToString()
ซึ่งเป็นวิธีดั้งเดิม ถ้าเปลี่ยนไปใช้ command parameter จะแก้ปัญหานี้ได้ค่อนข้างจะเด็ดขาดค่ะ
Date :
2010-07-16 00:53:32
By :
blurEyes
Load balance : Server 03