Câu lệnh SQL để chọn tất cả các hàng từ ngày hôm trước


120

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:


212

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)

@ashuthinks, bình luận của bạn không có ý nghĩa gì đối với tôi. Câu hỏi ban đầu hỏi làm thế nào để có được các hàng từ ngày hôm trước. Để làm được điều đó, bạn cần chỉ có được ngày hôm nay (không tính thời gian) và chỉ ngày hôm qua (không tính thời gian). Bạn sử dụng những ngày (vượt thời gian) này trong mệnh đề `WHERE`. Tuy nhiên, SELECT *sẽ trả lại bất kỳ ngày nào với thời gian ban đầu của họ.
KM.

dateiff đưa ra "Lỗi Đếm Tham số Không chính xác". và stackoverflow.com/a/18926156/3007408 cho biết dateiff chỉ có thể sử dụng 2 tham số. bất kì giải pháp nào??
Sp0T

@ Sp0T, câu hỏi này được gắn thẻ SQL Server , có hàm DATEDIFF () chấp nhận ba tham số ( msdn.microsoft.com/en-us/library/ms189794.aspx ) câu hỏi bạn liên kết đến là cho MySql, tôi đoán vậy hoạt động khác nhau như bạn đã tìm thấy. Bạn sẽ thấy rằng SQL không hoàn toàn có thể hoán đổi cho nhau, có nhiều điểm khác biệt như thế này giữa các nhà cung cấp khác nhau, đặc biệt là về xử lý ngày tháng.
KM.

Ồ cảm ơn. Không biết điều đó. Btw, tôi đã giải quyết vấn đề bằng cách sử dụng "giữa curdate () -1 ngày và curdate ()". Có thể nó cũng có thể được sử dụng trong trường hợp này.
Sp0T

1
@RasmusBidstrup, vâng. khi tôi chạy 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
KM.

44

Để 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())

"hẹn hò" Datatype doesnt tồn tại trong SQL Server 2005. Khi tôi sử dụng datetime thay vì giá trị ở lại thời gian và tính toán không xảy ra 00:00-12:00 nhưng từ khi bạn chạy các truy vấn
rudimenter

1
Lỗi của tôi. Tôi không thấy bạn đang xử lý SQL Server 2005. Thật vậy, mã của tôi chỉ hoạt động cho SQL Server 2008.
Konamiman

Tôi luôn nghĩ rằng DATEADD (ngày, ....) là một sự lãng phí, chỉ cần cộng hoặc trừ số ngày so với ngày: SELECT GETDATE () - 1
KM.

18

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.


3
Cái này hoạt động khá tốt, nhưng là đắt hơn nhiều so với 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
Václav Holuša

10
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);

Đây là người chiến thắng.
TmsKtel

5

Đó 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


4

Không thể kiểm tra nó ngay bây giờ, nhưng:

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)

3

Điều này nên làm điều đó:

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

1
(Xin lỗi) nhưng câu trả lời của bạn chỉ MySQL tương thích là, câu hỏi là cho SQL Server
StefanJCollier

2

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)

1

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ả.


1

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)) 

0

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.