2011-07-29 15 views
3

質問があります。私はフィールドの列を持つSQL Server 2008のテーブルがあります。私は、例えば次の日付を持っている:SQL日付質問

1/1/2001 
5/5/2004 
8/5/2009 
10/7/2011 
5/5/2012 
1/13/2014 

Idはすべての日付を表示できるようにしたい> =現在の日付(7/29/2011)だけでなく、<現在の日付である最大の表の日付。この例では、結果はすべて>= 8/5/2009となります。

誰かが私を助けることができますか?

+0

私は彼が探していると思うものをよりよく説明するために説明を編集しました。 –

+0

要件を明確にしてくださいますか? 「現在の日付より後ろの日付」と言うと、「昨日」という意味ですか?それとも、「今日のテーブルの最新の日付ですか?」という意味ですか? –

+1

あなたが使用しているRDBMS(SQL Serverなど)に加えて、どのバージョンを指定してください。 date/datetime/smalldatetimeというデータ型もchar/varcharとして格納されていますか?また、単語の問題ではなく、期待される結果を表形式で表示できますか? –

答えて

3

私が正しく理解していれば、現在の日付より前の日付を含めることができます。 GETDATE()は現在の日付を取得します(時間とともに)。あなたがそれで大丈夫なら、これはうまくいくはずです。そうしないと、GETDATEからわずか日付()

SELECT TheDate 
FROM DateTable 
WHERE TheDate >= (SELECT MAX(TheDate) FROM DateTable WHERE TheDate < GETDATE()) 

これは、現在の日付の前に最新の日付までのすべての日付以上の取得を解析する必要があります。

+0

はい、これはOPが望んでいると思われるものに非常に近いです。 –

0

私は理解していませんが、これは関連する日付の間のようです。それとも、何かが足りないのですか?あなたのテーブルを想定し

+0

彼は、現在の日付の直前の日付だけでなく、現在の日付の後のすべての日付も照会しようとしていると思います。 –

0

がDateTableと呼ばれ、あなたのフィールドがTheDateと呼ばれ、このようにそれを実行します。

SELECT TheDate 
FROM DateTable 
WHERE TheDate >= DATEADD(d, -2, GETDATE()) 

幸運!

+0

私は彼が今日の日付の前に、必ずしも前日ではない最初のエントリーを望んでいると信じています。(彼は8/5/09が返されたかったので、あなたの質問には含まれません) –

+0

ああ、面白いです。 –

4
select max(date) [date] from table where date < getdate() 
union 
select date from table where date >= getdate() 
+0

これはうまくいくかもしれませんが、組合のない解決策が良いと思われます。 – Narnian

+0

しかし、ネストされたselectはunionより優れていますか? – dizzwave

0

これは、使用しているSQLサーバによって異なります。 postgresのでは、たとえば、あなたが

SELECT fields FROM table WHERE date_field >= CURRENT_DATE - 1 

しかし、他のSQLサーバが指定するさまざまな方法を持っている "昨日" のようなものを必要とする

0
SELECT d1.* 
FROM dates d1 
    LEFT JOIN dates d2 ON d1.Date < d2.Date AND d2.Date < GETDATE() 
WHERE d2.Date IS NULL 

は説明:

があるため、すべての日付を選択します今日よりも早く、そして検査されている日より後の日付も存在しない。

0

ここでは、ゆるやかな物語と未知のデータタイプに基づいて推測しています。

DECLARE @t TABLE(d DATE); 

INSERT @t SELECT '20010101' 
UNION ALL SELECT '20040505' 
UNION ALL SELECT '20090805' 
UNION ALL SELECT '20111007' 
UNION ALL SELECT '20120505' 
UNION ALL SELECT '20140113'; 

DECLARE @now DATE = SYSDATETIME(); 

WITH t AS 
(
    SELECT d, rn = ROW_NUMBER() OVER (ORDER BY d) 
    FROM @t 
) 
SELECT t.d 
    FROM t LEFT OUTER JOIN t AS x 
    ON t.rn = x.rn - 1 
    WHERE COALESCE(x.d, @now) >= @now 
    ORDER BY t.d;