3

我使用这个 Store 过程从特殊日期返回数据。我的 QueueDate 类型是 datetime ,但是当我想在 Where 子句中使用 = 时它返回 0 ,我希望所有字段都在一天内独立于字段时间。

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,对吗?

要仅比较DateTime值的日期部分和您使用的 SQL Server 2008 或更高版本,您可以如前所述强制转换/转换为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 样式将日期时间值转换为紧凑形式的 ISO 8601 日期字符串 'yyyymmdd',然后将其转换回日期时间值。

或者,对于任何版本的 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 回答