ฉันมีสองตารางที่คอลัมน์เป็นประเภทของ[date]
DATETIME2(0)
ฉันต้องเปรียบเทียบสองเรคคอร์ดโดยส่วนวันที่ของพวกเขา (วัน + เดือน + ปี) การละทิ้งเวลาส่วน (ชั่วโมง + นาที + วินาที)
ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันมีสองตารางที่คอลัมน์เป็นประเภทของ[date]
DATETIME2(0)
ฉันต้องเปรียบเทียบสองเรคคอร์ดโดยส่วนวันที่ของพวกเขา (วัน + เดือน + ปี) การละทิ้งเวลาส่วน (ชั่วโมง + นาที + วินาที)
ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
ใช้CAST
เพื่อDATE
ชนิดข้อมูลใหม่ใน SQL Server 2008 เพื่อเปรียบเทียบเพียงส่วนวันที่:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
ข้อเสียเปรียบเล็กน้อยในคำตอบของ Marc ก็คือทั้งสองฟิลด์นั้นเป็น typecast ซึ่งหมายความว่าคุณจะไม่สามารถใช้ประโยชน์จากดัชนีใด ๆ ได้
ดังนั้นหากมีความจำเป็นต้องเขียนแบบสอบถามที่สามารถได้รับประโยชน์จากดัชนีในเขตข้อมูลวันที่แล้ววิธีการ (ค่อนข้างซับซ้อน) ต่อไปนี้เป็นสิ่งที่จำเป็น
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: วิธีอื่นของการแยกวันเท่านั้น (ใน SQL Server รุ่นเก่ากว่า) คือการใช้เล่ห์เหลี่ยมว่าวันที่จะแสดงภายในอย่างไร
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
แม้ว่าฉัน upvote คำตอบที่ทำเครื่องหมายว่าถูกต้อง ฉันต้องการที่จะสัมผัสกับบางสิ่งสำหรับทุกคนที่สะดุดกับเรื่องนี้
โดยทั่วไปหากคุณกรองเฉพาะค่าวันที่เพียงอย่างเดียว ไมโครซอฟท์แนะนำให้ใช้รูปแบบที่เป็นกลางภาษาหรือymd
y-m-d
โปรดทราบว่าแบบฟอร์ม '2007-02-12' นั้นถือว่าเป็นภาษาที่เป็นกลางสำหรับประเภทข้อมูล DATE, DATETIME2 และ DATETIMEOFFSET
การเปรียบเทียบวันที่โดยใช้วิธีการข้างต้นนั้นง่ายมาก พิจารณาตัวอย่างต่อไปนี้ที่วางแผนไว้
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
ในโลกที่สมบูรณ์แบบการหลีกเลี่ยงการดำเนินการใด ๆ กับคอลัมน์ที่ถูกกรองเพราะสิ่งนี้สามารถป้องกัน SQL Server ไม่ให้ใช้ดัชนีได้อย่างมีประสิทธิภาพ ที่กล่าวว่าหากข้อมูลที่คุณจัดเก็บเกี่ยวข้องกับวันที่และไม่ใช่เวลาเท่านั้นให้พิจารณาการจัดเก็บเหมือนกับDATETIME
เที่ยงคืนตามเวลา เพราะ:
เมื่อ SQL Server แปลงสัญพจน์เป็นชนิดของคอลัมน์ที่กรองแล้วมันจะถือว่าเป็นเวลาเที่ยงคืนเมื่อไม่มีการระบุส่วนของเวลา หากคุณต้องการให้ตัวกรองดังกล่าวส่งคืนแถวทั้งหมดจากวันที่ที่ระบุคุณต้องตรวจสอบให้แน่ใจว่าคุณเก็บค่าทั้งหมดด้วยเที่ยงคืนตามเวลา
ดังนั้นสมมติว่าคุณเกี่ยวข้องกับวันที่เท่านั้นและจัดเก็บข้อมูลของคุณเช่นนี้ แบบสอบถามด้านบนสามารถทำให้ง่ายขึ้นไปที่:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
คุณสามารถลองอันนี้
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
ฉันทดสอบว่าสำหรับ MS SQL 2014 โดยใช้รหัสต่อไปนี้
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
สำหรับการเปรียบเทียบสองวันเช่นDD / MM / YYYYเพื่อDD / MM โปรดจำไว้ว่าประเภทคอลัมน์สิ่งแรกของฟิลด์ต้องเป็น dateTime ตัวอย่าง: columnName: payment_date dataType: DateTime DateTime
หลังจากนั้นคุณสามารถเปรียบเทียบได้อย่างง่ายดาย ข้อความค้นหาคือ:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
มันง่ายมาก ...... มันทดสอบแล้วว่า .....