ฉันจะค้นหาวันที่ทั้งหมดที่มากกว่าวันที่กำหนดใน SQL Server ได้อย่างไร


338

ฉันกำลังพยายาม:

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date ดูเหมือนกับ: 2010-03-04 00:00:00.000

อย่างไรก็ตามสิ่งนี้ไม่ทำงาน

ทุกคนสามารถให้ข้อมูลอ้างอิงสำหรับสาเหตุได้หรือไม่


17
ใส่คำพูดเดียวรอบ ๆ มัน
Kevin DiTraglia

2
นอกจากคำพูดฉันขอแนะนำให้ใช้รูปแบบที่ปลอดภัยและไม่คลุมเครือสำหรับตัวอักษรสตริงวันที่เท่านั้น คนเดียวที่ฉันไว้วางใจคือ YYYYMMDD ดูความคิดเห็นของฉันที่มีต่อคำตอบของดาวิดด้วยเหตุผลว่าทำไม ...
แอรอนเบอร์ทรานด์

คำตอบ:


486
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

ในแบบสอบถามของคุณ2010-4-01จะถือว่าเป็นนิพจน์ทางคณิตศาสตร์ดังนั้นในสาระสำคัญมันอ่าน

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

(การ2010 minus 4 minus 1 is 2005 แปลงให้เหมาะสมdatetimeและการใช้เครื่องหมายคำพูดเดี่ยวจะช่วยแก้ไขปัญหานี้ได้)

ในทางเทคนิค parser อาจอนุญาตให้คุณไปกับ

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

มันจะทำการแปลงให้คุณ แต่ในความคิดของฉันมันสามารถอ่านได้น้อยกว่าการแปลงเป็นDateTimeโปรแกรมเมอร์การบำรุงรักษาที่จะมาหลังจากคุณอย่างชัดเจน


37
การแปลงที่ชัดเจนไม่จำเป็น นอกจากนี้ฉันขอแนะนำให้ใช้ YYYYMMDD แทน YYYY-MM-DD ทำไม? SET LANGUAGE FRENCHดีลองรหัสของคุณด้วย :-) สำหรับวันที่คุณจะได้รับ 4 มกราคมแทน 1 เมษายนสำหรับวันอื่นคุณอาจได้รับข้อผิดพลาดแทน
Aaron Bertrand

4
@Aaron Bertrant - คำตอบของฉันรวมถึงการแปลงที่ไม่จำเป็นเริ่มต้นด้วย "ทางเทคนิคผู้ช่วยอาจปล่อยให้คุณ <<รหัสตัวอย่างสุดท้าย> ฉันเพิ่งพบว่าอ่านง่ายขึ้นเพราะเห็นได้ชัดว่านี่เป็น วันที่ - เวลาระบบฐานข้อมูลมากเกินไปเก็บค่าวันที่ในฟิลด์ varchar แต่คุณถูกต้องเกี่ยวกับรูปแบบปกติเมื่อใช้การแปลงฉันเพิ่มในตัวระบุรูปแบบเช่นกัน แต่ฉันทำตัวอย่างจากด้านบนของฉัน หัว
เดวิด

1
@AaronBertrand ฉันต้องใช้คำแนะนำของคุณร่วมกับคำตอบข้างต้น: CONVERT(datetime, '20100401 10:01:01')- ผ่าน 2010-04-01 ทำงานใน SQL Server Management Studio แต่ไม่เมื่อส่งคำสั่ง SQL ผ่าน PHP / MSSQL
คลิปหนีบกระดาษ

ฉันคิดว่าชัดเจนว่าเป็นวันที่ดังนั้นจึงไม่จำเป็นต้องมีการแปลง
Jacques Mathieu

56

ลองใส่วันที่ของคุณเป็นสตริงอักขระ

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';

2
การเพิ่มเวลาจะให้ผลลัพธ์ที่แน่นอนโดยที่ A.Date> = 2014-01-12 12:28:00
shaijut

16

เราสามารถใช้เหมือนด้านล่างเช่นกัน

SELECT * 
FROM dbo.March2010 A
WHERE CAST(A.Date AS Date) >= '2017-03-22';

SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';

2
การแก้ไขคอลัมน์เพรดิเคตกรองไม่ใช่ความคิดที่ดีเลย มันป้องกันการใช้ดัชนีเกือบทั้งหมด
pimbrouwers

3
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

ก่อนอื่นให้แปลง TexBox เป็น Datetime จากนั้น .... ใช้ตัวแปรนั้นเป็น Query


3

เพื่อสรุปผลทั้งหมดคำตอบที่ถูกต้องคือ:

select * from db where Date >= '20100401'  (Format of date yyyymmdd)

สิ่งนี้จะหลีกเลี่ยงปัญหาใด ๆ กับระบบภาษาอื่นและจะใช้ดัชนี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.