Tôi đang tìm kiếm một Câu lệnh SQL tốt để chọn tất cả các hàng của ngày hôm trước từ một bảng. Bảng này chứa một cột ngày giờ. Tôi đang sử dụng SQL Server 2005.
Tôi đang tìm kiếm một Câu lệnh SQL tốt để chọn tất cả các hàng của ngày hôm trước từ một bảng. Bảng này chứa một cột ngày giờ. Tôi đang sử dụng SQL Server 2005.
Câu trả lời:
không có thời gian hôm nay:
SELECT dateadd(day,datediff(day,0,GETDATE()),0)
không có thời gian trong ngày hôm nay:
SELECT dateadd(day,datediff(day,1,GETDATE()),0)
truy vấn cho tất cả các hàng chỉ từ hôm qua:
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)
tôi nhận được:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
Để nhận giá trị "hôm nay" trong SQL:
convert(date, GETDATE())
Để có được "ngày hôm qua":
DATEADD(day, -1, convert(date, GETDATE()))
Để nhận "hôm nay trừ X ngày": thay đổi -1 thành -X.
Vì vậy, đối với tất cả các hàng của ngày hôm qua, bạn nhận được:
select * from tablename
where date >= DATEADD(day, -1, convert(date, GETDATE()))
and date < convert(date, GETDATE())
Có vẻ như câu trả lời rõ ràng đã bị thiếu. Để lấy tất cả dữ liệu từ một bảng (Ttable) trong đó cột (DatetimeColumn) là ngày giờ có dấu thời gian, bạn có thể sử dụng truy vấn sau:
SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday
Điều này có thể dễ dàng được thay đổi thành hôm nay, tháng trước, năm trước, v.v.
DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
khi nó có để đánh giá DATEDIFF () trên mỗi hàng
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
Đó là một chủ đề thực sự cũ, nhưng đây là lý do của tôi. Thay vì 2 mệnh đề khác nhau, một mệnh đề lớn hơn và nhỏ hơn. Tôi sử dụng cú pháp dưới đây để chọn bản ghi từ Ngày. Nếu bạn muốn có một phạm vi ngày thì các câu trả lời trước là cách để thực hiện.
SELECT * FROM TABLE_NAME WHERE
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0
Trong trường hợp trên, X sẽ là -1 cho các bản ghi của ngày hôm qua
Điều này nên làm điều đó:
WHERE `date` = CURDATE() - INTERVAL 1 DAY
Trong SQL Server làm như thế này:
where cast(columnName as date) = cast(getdate() -1 as date)
Bạn nên truyền cả hai mặt của biểu thức cho đến nay để tránh các vấn đề với định dạng thời gian.
Nếu bạn cần kiểm soát khoảng thời gian chi tiết hơn, thì bạn nên thử một cái gì đó như:
declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)
Một cách khác để nói với nó "Ngày hôm qua" ...
Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))
Có thể thấy điều này sẽ không hoạt động tốt vào ngày 1 tháng 1 cũng như ngày đầu tiên của mỗi tháng. Nhưng khi bay nó có hiệu quả.
Chà, việc truyền cột ngày giờ sang ngày và so sánh sẽ dễ dàng hơn.
SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) =
dateadd(day,0, convert(date, getdate(), 105))
subate (now (), 1) sẽ trả về dấu thời gian của ngày hôm qua Đoạn mã dưới đây sẽ chọn tất cả các hàng có dấu thời gian của ngày hôm qua
Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
SELECT *
sẽ trả lại bất kỳ ngày nào với thời gian ban đầu của họ.