日期和演员日期之间的结果不同

时间:2015-02-27 09:13:36

标签: sql-server tsql date casting

我是T-SQl世界的新手,这个问题令我感到困惑。

我正在针对我创建的变量运行查询,该变量保存了我的财政年度的开始日期,即2014-04-01。我要查询的数据将日期保存为日期时间字段,因此我一直使用CAST AS DATE删除时间戳。

如果我以这种方式运行此查询,我会收到25个结果:

select      count(B.WorkOrderNumber) as AWOCount
from        TSP1_Dev.AssetDataPortal.EllipseSiteList A left outer join
            TSP1_Dev.AssetDataPortal.tblWorkOrdersActive B
on          A.EquipmentLocation = B.EquipmentLocation   
where       
            B.EquipmentLocation = 'BISHT'

            and A.EquipmentClass = 'SW'
            and right(rtrim(A.EquipmentDesc),4) = '(OU)'
            and cast(B.CreationDate as Date) >= '2014-04-01';

然而,有一次我忘记了约会,当我这样做时,我收到了32个结果:

select      count(B.WorkOrderNumber) as AWOCount
from        TSP1_Dev.AssetDataPortal.EllipseSiteList A left outer join
            TSP1_Dev.AssetDataPortal.tblWorkOrdersActive B
on          A.EquipmentLocation = B.EquipmentLocation   
where       
            B.EquipmentLocation = 'BISHT'

            and A.EquipmentClass = 'SW'
            and right(rtrim(A.EquipmentDesc),4) = '(OU)'
            and B.CreationDate >= '2014-04-01';

有人可以告诉我为什么吗?为我的无知道歉! 尼尔

1 个答案:

答案 0 :(得分:1)

在查询中你有字符串文字,从你的评论我只能假设它是Coldfusion在你的查询中插入字符串文字。 (我对Coldfusion一无所知但是没有办法改用参数?)。

在SQL Server中,有一个字符串中日期部分顺序的设置。 SET DATEFORMAT

如果您的日期格式为dmy,则可以复制您看到的内容。

2014-04-01进行比较时,字符串文字yyyy-dd-mm被解释为datetime。添加新数据类型datedatetime2时,行为已更改,因此表单yyyy-mm-dd上的字符串文字将始终被解释为无论set dateformat如何。

因此,当您转换为date时,字符串文字将转换为日期2014-04-01,但当您与datetime进行比较时,字符串文字会转换为2014-01-04。< / p>

set dateformat dmy;

declare @T table(D datetime);

insert into @T(D) values
('20140101'),('20140201'),
('20140301'),('20140401'),
('20140501'),('20140601');

select count(*)
from @T
where D >= '2014-04-01';

select count(*)
from @T
where cast(D as date) >= '2014-04-01';

结果:

5

3

避免datetime问题的一种方法是使用不带破折号的字符串文字。无论20140401如何,yyyymmdd都将被解释为set dateformat