2011-08-08 19 views
0

は、今私は、現在の日からすべてのフィールドを取得するには、このコマンドを使用しています今日の正午と正午の間に入った - どうすればそれをやることができますか?SQL Server 2005の選択フィールドは

答えて

2

0.5は、それが醜い見えるかもしれないが、変数を宣言しなくても、

SELECT 
    COUNT(*) 
FROM 
    [SecureOrders] 
WHERE 
    DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) - 0.5 AND DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1) + 0.5 
0
DECLARE @NoonToday DATETIME; 

SET @NoonToday = DATEADD(HOUR, 12, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

SELECT COUNT(*) FROM [SecureOrders] 
WHERE [DateTime] >= DATEADD(DAY, -1, @NoonToday) 
AND [DateTime] < @NoonToday; 
0

(例えば半日)正午です0以外の整数値を日付として扱うことなく、次のようになります。

SELECT COUNT(*) 
FROM SecureOrders o 
    CROSS JOIN (
    SELECT DATEADD(HOUR, DATEDIFF(DAY, 0, GETDATE()) * 24 + 12, 0) 
) AS d (TodayNoon) 
WHERE o.DateTime < d.TodayNoon 
    AND o.DateTime >= DATEADD(DAY, -1, d.TodayNoon) 
+1

日付/時刻型の暗黙的な加算/減算操作を避けることをお勧めします。 SQL Server 2005ではうまく動作しますが、SQL Server 2008の新しいタイプとの互換性はありません(想像してみてください。多くの人が2005年に移行すると多くの人が移行します)。もう少しタイピングしていますが、DATEADDはより順方向互換性があり、意図ははるかに明確です。 –

+0

が合意した。 SQL Server 2008の解決策として他の人がSQL Server 2008のソリューションとして使用するのを防ぐために、この回答を残しておきます。 – heximal

0

@Aaron Bertrandのソリューションのバリエーションを動作するはずですし、

WHERE DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), -0.5) 
     AND 
     DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0.5) 
+0

あなたのコメントに問題は表示されませんが、問題ありません。私はまた、「クロスジョイン」が分かりやすいとは思っていませんが、何でもボートが浮かんでいます。 :-) –

+0

整数を日付として使用しないという考え方は、タイムスタンプの内部表現について仮定することではありません。唯一の例外はゼロです。これは丸めに使用されます。このソリューションでは、0は、その日が何であっても、ある日の始まりを示すタイムスタンプを表しているとみなします。私はそれが、日付に関する暗黙の操作から離れていることについての近所の質問に対するコメントで、あなたが言ったこととより一貫していると思った。私。ここでは、暗黙的な加算/減算を避けるだけでなく、暗黙的な変換も控えるようにしています。 :) –

+0

AFAIK 'CONVERT(DATETIME、DATEDIFF(DAY、0、CURRENT_TIMESTAMP))'はDATEADD(DAY、0、DATEDIFF(DAY、0、CURRENT_TIMESTAMP))と同じです - 実行するとすぐに前者が実行されますいくつかの他の 'DATEADD'。あなたの要点は分かりますが、SQL Server 2008では整数演算が壊れてしまいました。私が示した方法はデナリのCTP3でもうまくいきます - 巧妙な例: 'SELECT CONVERT(DATETIME2(7)、DATEADD(HOUR、5、DATEDIFF(DAY、2、CURRENT_TIMESTAMP)))' ...変数を使うのが間違っていると、新しい人々が物事を崩壊させ、部品をより良く理解するのに役立ちます。 –