我是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';
有人可以告诉我为什么吗?为我的无知道歉! 尼尔
答案 0 :(得分:1)
在查询中你有字符串文字,从你的评论我只能假设它是Coldfusion在你的查询中插入字符串文字。 (我对Coldfusion一无所知但是没有办法改用参数?)。
在SQL Server中,有一个字符串中日期部分顺序的设置。 SET DATEFORMAT
如果您的日期格式为dmy
,则可以复制您看到的内容。
与2014-04-01
进行比较时,字符串文字yyyy-dd-mm
被解释为datetime
。添加新数据类型date
和datetime2
时,行为已更改,因此表单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
。