คำสั่ง SQL เพื่อเลือกแถวทั้งหมดจากวันก่อนหน้า


121

ฉันกำลังมองหาคำสั่ง SQL ที่ดีเพื่อเลือกแถวทั้งหมดจากวันก่อนหน้าจากตารางเดียว ตารางมีคอลัมน์วันเวลาหนึ่งคอลัมน์ ฉันใช้ SQL Server 2005

คำตอบ:


213

รับวันนี้ไม่มีเวลา:

SELECT dateadd(day,datediff(day,0,GETDATE()),0)

รับ yestersday ไม่มีเวลา:

SELECT dateadd(day,datediff(day,1,GETDATE()),0)

ค้นหาแถวทั้งหมดจากเมื่อวานนี้เท่านั้น:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)

@ashuthinks ความคิดเห็นของคุณไม่สมเหตุสมผลกับฉัน คำถามเดิมถามว่าจะรับแถวจากวันก่อนหน้าได้อย่างไร ในการทำเช่นนั้นคุณต้องสามารถรับวันที่ของวันนี้เท่านั้น (ไม่มีเวลา) และวันที่ของเมื่อวานเท่านั้น (ไม่มีเวลา) คุณใช้วันที่ (เป็นอมตะ) เหล่านี้ในประโยค "WHERE" อย่างไรก็ตามSELECT *จะส่งคืนวันที่ใด ๆ กับเวลาเดิม
กม ธ .

dateiff ให้ "ข้อผิดพลาดการนับพารามิเตอร์ไม่ถูกต้อง" และstackoverflow.com/a/18926156/3007408ระบุว่า dateiff สามารถใช้พารามิเตอร์ได้ 2 ตัวเท่านั้น วิธีแก้ปัญหาใด ๆ ??
Sp0T

@ Sp0T คำถามนี้ติดแท็กSQL Serverซึ่งมีฟังก์ชัน DATEDIFF () ที่ยอมรับพารามิเตอร์สามตัว ( msdn.microsoft.com/en-us/library/ms189794.aspx ) คำถามที่คุณเชื่อมโยงเป็นสำหรับ MySql ซึ่งฉันเดาว่า ทำงานแตกต่างจากที่คุณพบ คุณจะพบว่า SQL ไม่สามารถใช้แทนกันได้อย่างสมบูรณ์มีความแตกต่างมากมายเช่นนี้ระหว่างผู้ขายที่แตกต่างกันโดยเฉพาะอย่างยิ่งเกี่ยวกับการจัดการวันที่
กม ธ .

โอ้ขอบคุณ ไม่ทราบว่า Btw ฉันแก้ไขปัญหาโดยใช้ "between curdate () -1 day และ curdate ()" อาจใช้ในกรณีนี้ได้ด้วย
Sp0T

1
@RasmusBidstrup ใช่ เมื่อฉันวิ่งSELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)ฉันจะได้รับ:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
กม.

44

ในการรับค่า "วันนี้" ใน SQL:

convert(date, GETDATE())

วิธีรับ "เมื่อวาน":

DATEADD(day, -1, convert(date, GETDATE()))

หากต้องการรับ "วันนี้ลบ X วัน" ให้เปลี่ยน -1 เป็น -X

ดังนั้นสำหรับแถวของเมื่อวานทั้งหมดคุณจะได้รับ:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())

"วันที่" ประเภทข้อมูลไม่มีอยู่ใน SQL Server 2005 เมื่อฉันใช้วันที่และเวลาแทนค่าเวลาจะยังคงอยู่และการคำนวณจะไม่เกิดขึ้นตั้งแต่เวลา 00.00 น. ถึง 12.00 น. แต่นับจากเวลาที่คุณเรียกใช้แบบสอบถาม
rudimenter

1
ความผิดพลาดของฉัน. ฉันไม่เห็นว่าคุณกำลังจัดการกับ SQL Server 2005 อันที่จริงรหัสของฉันใช้ได้กับ SQL Server 2008 เท่านั้น
Konamiman

ฉันคิดเสมอว่า DATEADD (วัน .... ) เป็นสิ่งที่สิ้นเปลืองเพียงแค่บวกหรือลบจำนวนวันเทียบกับวันที่: SELECT GETDATE () - 1
KM

18

ดูเหมือนว่าจะไม่มีคำตอบที่ชัดเจน หากต้องการรับข้อมูลทั้งหมดจากตาราง (Ttable) โดยที่คอลัมน์ (DatetimeColumn) เป็นวันที่และเวลาที่มีการประทับเวลาสามารถใช้แบบสอบถามต่อไปนี้:

SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday

ซึ่งสามารถเปลี่ยนเป็นวันนี้เดือนที่แล้วปีที่แล้ว ฯลฯ ได้อย่างง่ายดาย


3
อันนี้ใช้ได้ดี แต่แพงกว่ามากเมื่อเทียบกับDatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)การประเมิน DATEDIFF () ในแต่ละแถว
VáclavHoluša


5

มันเป็นกระทู้เก่าจริงๆ แต่นี่คือสิ่งที่ฉันทำ แทนที่จะเป็น 2 ส่วนคำสั่งที่แตกต่างกันหนึ่งส่วนที่มากกว่าและน้อยกว่า ฉันใช้ไวยากรณ์ด้านล่างนี้เพื่อเลือกระเบียนจาก A date หากคุณต้องการช่วงวันที่คำตอบก่อนหน้านี้เป็นวิธีที่จะไป

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0

ในกรณีข้างต้น X จะเป็น -1 สำหรับบันทึกของเมื่อวานนี้



3

สิ่งนี้ควรทำ:

WHERE `date` = CURDATE() - INTERVAL 1 DAY

1
(ขออภัย) แต่คำตอบของคุณเข้ากันได้กับ MySQL เท่านั้นคำถามสำหรับ SQL Server
StefanJCollier

2

ใน SQL Server ทำเช่นนี้:

where cast(columnName as date) = cast(getdate() -1 as date)

คุณควรแคสต์ทั้งสองด้านของนิพจน์ให้เป็นปัจจุบันเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการจัดรูปแบบเวลา

หากคุณต้องการควบคุมช่วงเวลาโดยละเอียดคุณควรลองทำสิ่งต่อไปนี้

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)

1

อีกวิธีที่จะบอกมันว่า "เมื่อวาน" ...

Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))

สิ่งนี้อาจไม่ได้ผลในวันที่ 1 มกราคมและวันแรกของทุกเดือน แต่ในทันทีมันมีประสิทธิภาพ


1

การแคสต์คอลัมน์วันที่และเวลาในปัจจุบันทำได้ง่ายกว่าและเปรียบเทียบได้ง่ายกว่า

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 

0

วันที่ย่อย (now (), 1) จะแสดงเวลาประทับของเมื่อวานนี้รหัสด้านล่างจะเลือกแถวทั้งหมดที่มีการประทับเวลาของเมื่อวานนี้

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.