การสืบค้นตามช่วงเวลา

การสืบค้นตามช่วงเวลา
Microsoft SQL Server สามารถจำลอง Locale ฝั่ง Client ได้ผ่านคำสั่ง SET LANGUAGE
DECLARE @myDate date; SET LANGUAGE British; SET @myDate='05/08/2019' SELECT @myDate as BritishEng; SET LANGUAGE US_ENGLISH; SET @myDate='05/08/2019' SELECT @myDate as USEng; |
ผลลัพธ์ที่ได้
Changed language setting to British. BritishEng ---------- 2019-08-05 Changed language setting to us_english. USEng ---------- 2019-05-08 |
แต่หากผู้ใช้เปลี่ยนการป้อนข้อมูลวันที่ที่เป็นกลาง อาทิ ‘Aug 5, 2019’ , ‘August 5, 2019’ , ‘5 Aug 2019’ , ‘5 August 2019’ , ‘2019-08-05’, ‘2019.08.05’, ‘20190805’ ไม่ว่าจะมาจาก Client ต่าง Locale กันก็จะไม่มีปัญหา ดังตัวอย่าง
DECLARE @myDate date; SET LANGUAGE British; SET @myDate='Aug 5, 2019' SELECT @myDate as BritishEng; SET LANGUAGE US_ENGLISH; SET @myDate='Aug 5, 2019' SELECT @myDate as USEng; |
หรือ
DECLARE @myDate date; SET LANGUAGE British; SET @myDate='2019.08.05' SELECT @myDate as BritishEng; SET LANGUAGE US_ENGLISH; SET @myDate='2019.08.05' SELECT @myDate as USEng; |
ผลลัพธ์ที่ได้คือ
Changed language setting to British. BritishEng ---------- 2019-08-05 Changed language setting to us_english. USEng ---------- 2019-08-05 |
การเตรียมข้อมูลตัวอย่าง
ผู้เขียนเตรียมตาราง TestOrders ตามสคริปต์ต่อไปนี้ เพื่อใช้ทดสอบการคิวรี่
CREATE DATABASE TestDB; GO USE TestDB; GO CREATE TABLE TestOrders ( OrderID int IDENTITY(1,1) PRIMARY KEY , OrderDate datetime NOT NULL ) GO INSERT INTO TestOrders VALUES ('Jan 1 ,2019 12:38:45.123') , ('Jan 1 ,2019 13:42:59.001') , ('Jan 1 ,2019 14:21:41.165') , ('Jan 2 ,2019 00:00:00.000') , ('Jan 2 ,2019 12:11:55.321') , ('Jan 3 ,2019 07:34:26.528') , ('Jan 4 ,2019 09:31:52.847') GO |
Note:
|
หากต้องการสืบค้นใบสั่งซื้อในวันที่ 1 มกราคม 2519 โดยป้อนเพียงวันที่จะไม่ได้ผลลัพธ์แม้แต่แถวข้อมูลเดียวดังแสดง
SELECT * FROM TestOrders WHERE OrderDate='Jan 1,2019'; |
ผลลัพธ์ที่ได้
OrderID OrderDate ---------------------------------------------- |
เหตุผลเพราะหากป้อนเพียง ‘Jan 1, 2019’ จะหมายถึง ‘Jan 1, 2019 00:00:00.000’ ซึ่งไม่ตรงกับแถวข้อมูลใดเลย การสืบค้นที่ควรคือระบุเป็นช่วงข้อมูลดังนี้
SELECT * FROM TestOrders WHERE OrderDate>='Jan 1,2019' AND OrderDate< 'Jan 2,2019'; |
ผลลัพธ์ที่ได้
OrderID OrderDate ----------- ----------------------- 1 2019-01-01 12:38:45.123 2 2019-01-01 13:42:59.000 3 2019-01-01 14:21:41.167 (3 rows affected) |
ซึ่งจะมีแถวข้อมูลของวันที่ 2 มกราคม 2019 เวลาเที่ยงคืนปนมาด้วย ดังแสดง
SELECT * FROM TestOrders WHERE OrderDate BETWEEN 'Jan 1,2019' AND 'Jan 2,2019'; |
ผลลัพธ์ที่ได้
OrderID OrderDate ----------- ----------------------- 1 2019-01-01 12:38:45.123 2 2019-01-01 13:42:59.000 3 2019-01-01 14:21:41.167 4 2019-01-02 00:00:00.000 (4 rows affected) |
การคิวรี่ที่ไม่แนะนำ
SELECT * FROM TestOrders WHERE CONVERT(Date,OrderDate)='Jan 1, 2019'; |
คิวรี่ที่ไม่แนะนำแบบที่ 2
SELECT * FROM TestOrders WHERE YEAR(OrderDate)=2019 AND MONTH(OrderDate)=1 AND DAY(OrderDate)=1; |