Önceki günden tüm satırları seçmek için SQL ifadesi


121

Bir tablodan önceki günden tüm satırları seçmek için iyi bir SQL İfadesi arıyorum. Tabloda bir tarih saat sütunu bulunur. SQL Server 2005 kullanıyorum.

Yanıtlar:


213

bugün olsun hiç vakit yok:

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

dün hiç vakit kaybetmeden:

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

sadece dünden tüm satırlar için sorgu:

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

@ashuthinks, yorumunuz bana mantıklı gelmiyor. Orijinal soru, önceki günden satırların nasıl alınacağını sorar. Bunu yapmak için yalnızca bugünün tarihini (saat yok) ve yalnızca dünün tarihini (saat yok) alabilmeniz gerekir. Bu (zamansız) tarihleri ​​'WHERE` yan tümcesinde kullanırsınız. Ancak, SELECT *herhangi bir tarihi orijinal saatleriyle döndürür.
KM.

tarihliiff "Yanlış Parametre Sayısı hatası" veriyor. ve stackoverflow.com/a/18926156/3007408 , tarihliiff'in yalnızca 2 parametre kullanabileceğini söylüyor. herhangi bir çözüm??
Sp0T

@ Sp0T, bu soru, bağladığınız soru tahmin ettiğim gibi MySql için olan üç parametreyi ( msdn.microsoft.com/en-us/library/ms189794.aspx ) kabul eden bir DATEDIFF () işlevine sahip olan SQL Server etiketlidir. bulduğunuz gibi farklı çalışır. SQL'in tamamen birbirinin yerine geçemez olduğunu göreceksiniz, farklı satıcılar arasında, özellikle tarih işleme konusunda bunun gibi pek çok fark vardır.
KM.

Ohh, teşekkürler. Bunu bilmiyordum. Btw Sorunu "curdate () -1 gün ile curdate () arasında" kullanarak çözdüm. Bu durumda da kullanılabilir.
Sp0T

1
@RasmusBidstrup, evet. koştuğumda SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)şunu elde ederim:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.

44

SQL'de "bugün" değerini almak için:

convert(date, GETDATE())

"Dün" almak için:

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

"Bugün eksi X gün" elde etmek için: -1'i -X olarak değiştirin.

Yani dünün tüm satırları için şunları elde edersiniz:

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

"tarih" Veri türü SQL Server 2005'te mevcut değil. Bunun yerine datetime'ı kullandığımda saat değeri kalıyor ve hesaplama 0am ile 12pm arasında değil, Sorguyu çalıştırdığınız andan itibaren
rudimenter

1
Benim hatam. SQL Server 2005 ile uğraştığınızı görmedim. Aslında, kodum yalnızca SQL Server 2008 için çalışıyor.
Konamiman

Her zaman DATEADD'nin (gün, ....) bir israf olduğunu düşünmüşümdür, sadece tarihe göre gün sayısını ekleyin veya çıkarın: GETDATE SEÇİN () - 1
KM.

18

Görünüşe göre apaçık cevap eksikti. Sütunun (DatetimeColumn) bir zaman damgası olan bir tarih saat olduğu bir tablodan (Ttable) tüm verileri almak için aşağıdaki sorgu kullanılabilir:

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

Bu kolayca bugün, geçen ay, geçen yıl vb. Olarak değiştirilebilir.


3
Bu oldukça iyi çalışıyor, ancak DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)her satırda DATEDIFF () değerini değerlendirmek zorunda olduğu için çok daha pahalı
Václav Holuša


5

Bu gerçekten eski bir konu, ama işte benim onunla ilgili görüşüm. 2 farklı cümle yerine, bir büyüktür ve küçüktür. A tarihinden itibaren kayıtları seçmek için aşağıdaki sözdizimini kullanıyorum. Bir tarih aralığı istiyorsanız, önceki cevaplar gitmenin yoludur.

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

Yukarıdaki durumda X, dünün kayıtları için -1 olacaktır


4

Şu anda test edemezsiniz, ancak:

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

3

Bunu yapmalı:

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

1
(Üzgünüz) ancak cevabınız yalnızca MySQL uyumlu, soru SQL Server için
StefanJCollier

2

SQL Server'da şunu yapın:

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

Saat formatlamayla ilgili sorunları önlemek için ifadenin her iki tarafını da bugüne kadar çevirmelisiniz.

Aralığı daha ayrıntılı olarak kontrol etmeniz gerekiyorsa, aşağıdaki gibi bir şey denemelisiniz:

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

1

"Dün" demenin başka bir yolu ...

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

Bu muhtemelen 1 Ocak'ta ve her ayın ilk gününde iyi sonuç vermeyecektir. Ama anında etkilidir.


1

Tarih saat sütununu bugüne kadar dönüştürmek ve karşılaştırmaktan daha kolaydır.

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

0

alt tarih (şimdi (), 1) dünün zaman damgasını döndürecek Aşağıdaki kod, dünün zaman damgasını içeren tüm satırları seçecektir

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.