3

この Store プロシージャを使用して、特別な日付からデータを返しました。私の QueueDate タイプは datetime ですが、Wh​​ere 句で = を使用したい場合は 0 を返します。フィールドの時間で 1 日独立しているすべてのフィールドが必要です。

ALTER PROCEDURE [dbo].[SP_GET_QUEUESINFO_BY_DATE]
AS
BEGIN
declare @date2 datetime
set @date2= '2012-09-21'
select COUNT(QueueID) ,
sum(case when QueueNumIn != 0 THEN 1 else 0 end) as 'InQueue',
sum(case when QueueNumOut != 0 THEN 1 else 0 end) as  'OutQueue'
from Queue where QueueDate >= @date2 -- QueueDate = @date2
END

ここに画像の説明を入力

4

3 に答える 3

5

CAST列名を変更してデータ型DATETIMEDATE(バージョン 2008+ より前) に変更できます。試す、

ALTER PROCEDURE [dbo].[SP_GET_QUEUESINFO_BY_DATE]
AS
BEGIN
declare @date2 datetime
set @date2= '2012-09-21'
select COUNT(QueueID) ,
       sum(case when QueueNumIn != 0 THEN 1 else 0 end) as 'InQueue',
       sum(case when QueueNumOut != 0 THEN 1 else 0 end) as  'OutQueue'
from Queue 
where CAST(QueueDate as DATE) >= @date2 -- QueueDate = @date2
END
于 2012-09-21T16:42:49.977 に答える
2

SQL Server ですね。

値の日付コンポーネントのみを比較するには、 SQL Server 2008 以降を使用しています。前述のように、データ型DateTimeにキャスト/変換できます。Dateこのようなことをする必要があります:

select *
from foo
where convert(date,foo.someDateTimeColumn) = '2012-10-27'

SQL Serverのどのバージョンでも、次のように動作します。

select *
from foo
where convert(datetime,convert(varchar,foo.someDateTimeColumn,112),112) = '2012-10-27'

上記は、112 スタイルを使用して、datetime 値をコンパクトな形式の ISO 8601 日付文字列 'yyyymmdd' に変換し、それを datetime 値に変換します。

または、SQL Server のどのバージョンでも、期間に対してテストできます。

declare
  @dtNow datetime
set @dtNow = current_timestamp

declare
  @TodayStartOfDay datetime ,
  @TodayEndOfDay   datetime
set @TodayStartOfDay = convert(datetime,convert(varchar,@dtNow,112),112)
set @TodayEndOfDay   = dateadd(ms,-3,datetime(day,1,@dtFrom))

...

select *
from foo
where foo.someDateTimeColumn between @TodayStartOfDay and @TodayEndOfDay

このアプローチの利点は、DateTime 列のすべてのインデックスがクエリ オプティマイザーで使用できることです。

于 2012-09-21T16:56:56.900 に答える
0
WHERE DATEDIFF(DAY,@date2, QueueDate)=0
于 2012-09-21T16:45:57.030 に答える