ฉันกำลังมองหาคำสั่ง SQL ที่ดีเพื่อเลือกแถวทั้งหมดจากวันก่อนหน้าจากตารางเดียว ตารางมีคอลัมน์วันเวลาหนึ่งคอลัมน์ ฉันใช้ SQL Server 2005
ฉันกำลังมองหาคำสั่ง SQL ที่ดีเพื่อเลือกแถวทั้งหมดจากวันก่อนหน้าจากตารางเดียว ตารางมีคอลัมน์วันเวลาหนึ่งคอลัมน์ ฉันใช้ SQL Server 2005
คำตอบ:
รับวันนี้ไม่มีเวลา:
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)
SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)
ฉันจะได้รับ:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
ในการรับค่า "วันนี้" ใน 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())
ดูเหมือนว่าจะไม่มีคำตอบที่ชัดเจน หากต้องการรับข้อมูลทั้งหมดจากตาราง (Ttable) โดยที่คอลัมน์ (DatetimeColumn) เป็นวันที่และเวลาที่มีการประทับเวลาสามารถใช้แบบสอบถามต่อไปนี้:
SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday
ซึ่งสามารถเปลี่ยนเป็นวันนี้เดือนที่แล้วปีที่แล้ว ฯลฯ ได้อย่างง่ายดาย
DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
การประเมิน DATEDIFF () ในแต่ละแถว
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
มันเป็นกระทู้เก่าจริงๆ แต่นี่คือสิ่งที่ฉันทำ แทนที่จะเป็น 2 ส่วนคำสั่งที่แตกต่างกันหนึ่งส่วนที่มากกว่าและน้อยกว่า ฉันใช้ไวยากรณ์ด้านล่างนี้เพื่อเลือกระเบียนจาก A date หากคุณต้องการช่วงวันที่คำตอบก่อนหน้านี้เป็นวิธีที่จะไป
SELECT * FROM TABLE_NAME WHERE
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0
ในกรณีข้างต้น X จะเป็น -1 สำหรับบันทึกของเมื่อวานนี้
ไม่สามารถทดสอบได้ในขณะนี้ แต่:
select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)
สิ่งนี้ควรทำ:
WHERE `date` = CURDATE() - INTERVAL 1 DAY
ใน 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)
อีกวิธีที่จะบอกมันว่า "เมื่อวาน" ...
Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))
สิ่งนี้อาจไม่ได้ผลในวันที่ 1 มกราคมและวันแรกของทุกเดือน แต่ในทันทีมันมีประสิทธิภาพ
การแคสต์คอลัมน์วันที่และเวลาในปัจจุบันทำได้ง่ายกว่าและเปรียบเทียบได้ง่ายกว่า
SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) =
dateadd(day,0, convert(date, getdate(), 105))
วันที่ย่อย (now (), 1) จะแสดงเวลาประทับของเมื่อวานนี้รหัสด้านล่างจะเลือกแถวทั้งหมดที่มีการประทับเวลาของเมื่อวานนี้
Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
SELECT *
จะส่งคืนวันที่ใด ๆ กับเวลาเดิม