前日のすべての行を選択するSQLステートメント


120

1つのテーブルから前日のすべての行を選択するための適切なSQLステートメントを探しています。テーブルは1つの日時列を保持します。SQL Server 2005を使用しています。

回答:


210

今日は時間がない:

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

昨日の時間がない:

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)

@ashuthinks、あなたのコメントは私には意味がありません。元の質問は、前日から行を取得する方法を尋ねています。そのためには、今日の日付のみ(時間なし)と昨日の日付のみ(時間なし)を取得できる必要があります。これらの(時間のない)日付は、 `WHERE`句で使用します。ただし、はSELECT *元の時刻で日付を返します。
和基。

datediffは「不正なパラメーター数エラー」を出します。また、stackoverflow.com / a / 18926156/3007408によると、datediffは2つのパラメーターしか使用できません。解決策はありますか?
Sp0T

@ Sp0T、この質問はタグ付けされたSQL Serverで、3つのパラメーター(msdn.microsoft.com/en-us/library/ms189794.aspx)を受け入れるDATEDIFF()関数が含まれています。リンク先の質問はMySqlに関するもので、これはおそらくあなたが見つけたように異なる動作をします。SQLは完全に交換可能ではないことがわかります。特に日付の処理に関しては、ベンダーごとにこのような多くの違いがあります。
和基。

ああ、ありがとう。それを知りませんでした。ところで、「curdate()-1日とcurdate()の間」を使用して問題を解決しました。この場合にも使用できるかもしれません。
Sp0T

1
@RasmusBidstrup、はい。私が実行したときにSELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)、私が得る:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KMを。

44

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

"date"データ型はSQL Server 2005には存在しません。代わりにdatetimeを使用すると、時間の値はそのまま残り、計算は午前0時から午後12時ではなく、クエリを実行した時間から行われます
rudimenter

1
私の間違い。SQL Server 2005を扱っていることはわかりませんでした。実際、私のコードはSQL Server 2008でのみ機能します。
コナミマン

DATEADD(day、....)は無駄だといつも思っていました。日付に対して日数を加算または減算するだけです: SELECT GETDATE()-1
KM。

18

明らかな答えが欠けていたようです。列(DatetimeColumn)がタイムスタンプ付きの日時であるテーブル(Ttable)からすべてのデータを取得するには、次のクエリを使用できます。

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

これは、今日、先月、昨年などに簡単に変更できます。


3
この1はかなりうまく動作しますが、に比べてはるかに高価であるDatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)、それは各行のDATEDIFF()を評価する必要があるため、
ヴァーツラフHoluša


5

これは本当に古いスレッドですが、ここでは私の見解を示します。2つの異なる句ではなく、1つの大きい句と小さい句。以下の構文を使用して、A日付からレコードを選択します。日付範囲が必要な場合は、以前の回答が適切です。

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

上記の場合、Xは昨日の記録では-1になります。


4

現在はテストできませんが、次の点に注意してください。

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

3

これはそれを行うはずです:

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

1
(申し訳ありません)しかし、あなたの答えはMySQLと互換性があるだけです。質問はSQL Serverに対するものです
StefanJCollier

2

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)

1

「昨日」を伝える別の方法...

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

これはおそらく、1月1日と毎月の最初の日にはうまく機能しません。しかし、その場でそれは効果的です。


1

ええと、日時列を日付にキャストして比較する方が簡単です。

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

0

subdate(now()、1)は昨日のタイムスタンプを返します以下のコードは、昨日のタイムスタンプを持つすべての行を選択します

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.