Pernyataan SQL untuk memilih semua baris dari hari sebelumnya

120

Saya mencari Pernyataan SQL yang bagus untuk memilih semua baris dari hari sebelumnya dari satu tabel. Tabel tersebut memiliki satu kolom datetime. Saya menggunakan SQL Server 2005.

rudimenter
sumber

Jawaban:

212

dapatkan hari ini tidak ada waktu:

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

dapatkan waktu kemarin:

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

kueri untuk semua baris hanya dari kemarin:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)
KM.
sumber
@ashuthinks, komentar Anda tidak masuk akal bagi saya. Pertanyaan asli menanyakan bagaimana mendapatkan baris dari hari sebelumnya. Untuk melakukan itu, Anda harus bisa mendapatkan tanggal hari ini saja (tidak ada waktu) dan tanggal kemarin saja (tidak ada waktu). Anda menggunakan tanggal (timeless) ini di klausa` WHERE`. Namun, SELECT *akan mengembalikan tanggal dengan waktu aslinya.
KM.
tanggaliff memberikan "kesalahan Penghitungan Parameter". dan stackoverflow.com/a/18926156/3007408 mengatakan dateiff hanya dapat menggunakan 2 parameter. ada solusi ??
Sp0T
@ Sp0T, pertanyaan ini diberi tag SQL Server , yang memiliki fungsi DATEDIFF () yang menerima tiga parameter ( msdn.microsoft.com/en-us/library/ms189794.aspx ) pertanyaan yang Anda tautkan adalah untuk MySql, yang saya kira bekerja secara berbeda seperti yang Anda temukan. Anda akan menemukan bahwa SQL tidak sepenuhnya dapat dipertukarkan, ada banyak perbedaan seperti ini antara vendor yang berbeda, terutama mengenai penanganan tanggal.
KM.
Ohh terima kasih. Tidak tahu itu. Btw saya memecahkan masalah dengan menggunakan "antara curdate () -1 hari dan curdate ()". Mungkin bisa digunakan dalam kasus ini juga.
Sp0T
1
@RasmusBidstrup, ya. ketika saya lari SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)saya mendapatkan:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.
44

Untuk mendapatkan nilai "hari ini" di SQL:

convert(date, GETDATE())

Untuk mendapatkan "kemarin":

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

Untuk mendapatkan "hari ini dikurangi X hari": ubah -1 menjadi -X.

Jadi untuk semua baris kemarin, Anda mendapatkan:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())
Konamiman
sumber
"date" Datatype tidak ada di SQL Server 2005. Ketika saya menggunakan datetime, nilai waktu tetap dan kalkulasi terjadi bukan dari 0am hingga 12pm tetapi dari saat Anda menjalankan Query
rudimenter
1
Kesalahanku. Saya tidak melihat Anda berurusan dengan SQL Server 2005. Memang, kode saya hanya berfungsi untuk SQL Server 2008.
Konamiman
Saya selalu berpikir bahwa DATEADD (hari, ....) adalah pemborosan, cukup tambahkan atau kurangi jumlah hari terhadap tanggal: PILIH GETDATE () - 1
KM.
18

Sepertinya jawaban yang jelas hilang. Untuk mendapatkan semua data dari tabel (Ttable) di mana kolom (DatetimeColumn) adalah datetime dengan stempel waktu, kueri berikut dapat digunakan:

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

Ini dapat dengan mudah diubah menjadi hari ini, bulan lalu, tahun lalu, dll.

panggil aku Steve
sumber
3
Yang ini bekerja dengan cukup baik, tetapi jauh lebih mahal dibandingkan dengan DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)karena harus mengevaluasi DATEDIFF () pada setiap baris
Václav Holuša
10
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
Romancha KC
sumber
Ini pemenangnya.
TmsKtel
5

Ini adalah utas yang sangat tua, tapi inilah pendapat saya. Daripada 2 klausa yang berbeda, satu lebih besar dari dan kurang dari. Saya menggunakan sintaks di bawah ini untuk memilih catatan dari tanggal A. Jika Anda menginginkan rentang tanggal maka jawaban sebelumnya adalah cara yang tepat.

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

Dalam kasus di atas, X akan menjadi -1 untuk catatan kemarin

Rahul
sumber
4

Tidak dapat mengujinya sekarang, tetapi:

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

Ini harus melakukannya:

WHERE `date` = CURDATE() - INTERVAL 1 DAY
candlejack
sumber
1
(Maaf) tetapi jawaban Anda hanya kompatibel dengan MySQL, pertanyaannya adalah untuk SQL Server
StefanJCollier
2

Di SQL Server, lakukan seperti ini:

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

Anda harus mentransmisikan kedua sisi ekspresi hingga saat ini untuk menghindari masalah dengan pemformatan waktu.

Jika Anda perlu mengontrol interval lebih detail, maka Anda harus mencoba sesuatu seperti:

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)
Mário Meyrelles
sumber
1

Cara lain untuk mengatakannya "Kemarin" ...

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

Ini mungkin tidak akan bekerja dengan baik pada tanggal 1 Januari, dan juga pada hari pertama setiap bulan. Tapi dengan cepat itu efektif.

pengguna3428292
sumber
1

Nah, lebih mudah untuk mentransmisikan kolom tanggal waktu ke tanggal dan daripada membandingkan.

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

subdate (now (), 1) akan mengembalikan cap waktu kemarin Kode di bawah ini akan memilih semua baris dengan cap waktu kemarin

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Dismi Paul
sumber