1

レポートを制限して、日付Aから日付Bまでのレコードを返すようにします。これは私が行っていることです。

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... 1月1日午前12時から3月31日午後11時59分までのレコードが返されると言われました(時刻が示されていない場合は深夜がデフォルトです)。しかし、不一致に気づきました。つまり、レコードの時刻が00:00:00の場合、このセットの一部になります。

これを行うためのより正確な方法はありますか?それにより、希望する日付範囲が正確に返されますか?*

私は時間を使ってみました:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008 00:00:00'
set @endDate = '04/01/2008 11:59:59'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

...しかし、私は何か奇妙なことに気づきました。SQLServerは100分の1秒を半分に丸めます。したがって、11:59:29以降に使用すると、その4月1日のレコード(ha!エイプリルフールのレコード!grr)が取得されます。何故ですか?

  • (確かにあると思います。私はこれが初めてです。あなたの助けに感謝します!)
4

5 に答える 5

5

常に簡単なオプションがあります:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date >= @startDate 
and   date < @endDate
于 2009-01-05T19:53:16.007 に答える
2

view_Inspections の日付列は SmallDateTime データ型であると思われます。このデータ型の精度は 1 分であり、予期しない結果 (秒を最も近い分に丸める) を説明しています。

Roland Shaw が提案する方法は、要件に合わせてクエリを変更するための最良の方法です。

于 2009-01-05T20:14:29.850 に答える
1

BETWEEN 演算子は包括的であるため、最初のクエリで得られた結果が表示されます。2 番目のクエリで見られる丸めは、テーブルで使用している正確な datetime データ型に依存します。(ところで、秒と100分の1秒を混同していると思います)。おそらくテーブルで smalldatetime を使用しているようです。その場合、時間は最も近い分に丸められます。

テーブルで日時を使用している場合は、@startDate と @endDate を DATETIME 値 (CAST(@endDate AS DATETIME)) に明示的に変換してみてください。

簡単なメモ... DATETIME 値の場合でも、SQL Server は 100 分の 3 秒までしか正確ではないため、11:59:59.999 は 12:00:00.000 に切り上げられます。

基本的に次の 3 つの選択肢があります。

1) CAST('01/01/2008 00:00:00.000' AS DATETIME) と CAST('03/31/2008 12:59:59.997' AS DATETIME) の間

2) YEAR(my_date) = 2008 AND MONTH(my_date) BETWEEN 1 AND 3

3) my_date >= CAST('01/01/2008 00:00:00.000' AS DATETIME) AND my_date < CAST('04/01/2008 00:00:00.000' AS DATETIME)

最初の方法はあまり直感的ではなく、私の意見ではエラーが発生しやすいです。2 番目の方法では、インデックスを使用できないためパフォーマンスが低下します。また、数年にまたがる検索や、月の途中で開始/終了する検索を実行できる場合は、はるかに複雑になります。ローランドが提案した 3 番目の方法は、私が考える最良の方法です。

于 2009-01-05T20:25:30.950 に答える
1

次のように、日付フィールドから時刻を削除してみてください。

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

SELECT min(date),max(date) FROM view_Inspections 
WHERE CAST(FLOOR(CAST(date AS FLOAT)) AS DATETIME) BETWEEN CAST(@startDate AS DATETIME) And CAST(@startDate AS DATETIME))

01/01/2008 00:00:00これは からまでのすべてを返します04/01/2008 11:59:59.999。含めたくない場合は04/01、終了日を に変更してください03/31/2008

于 2010-11-01T20:48:11.180 に答える
0

あなたの最善の解決策は、「ジュリアン」と呼ばれる BIGINT(10) フィールドを作成し、それを YYYYMMDD に格納することです。

次に、クエリ where julian >= '20120103' AND julian <= '20120203' を実行します

于 2013-04-03T19:25:41.143 に答える