Crystal Reports SQL查询给出奇怪的结果-有人能解释为什么吗?

Crystal Reports SQL查询给出奇怪的结果-有人能解释为什么吗?,sql,sql-server,string,date,crystal-reports,Sql,Sql Server,String,Date,Crystal Reports,我正在更新公司的一些旧crystal报表,偶然发现一些报表在yyyy-MM-dd范围内搜索日期,而另一些报表在yyyyymdd范围内搜索日期。我还发现它们的结果略有不同,所以我开始进一步研究这个问题 我检查了数据库(在MS SQL Server上运行),它将日期作为字符串存储在正在搜索的字段中的yyyyMMdd格式中 在使用yyyy-MM-dd格式的报告中,Crystal reports进行的SQL查询包含 WHERE ("Remiss_ank"."Skapad_datum">='2013

我正在更新公司的一些旧crystal报表,偶然发现一些报表在
yyyy-MM-dd
范围内搜索日期,而另一些报表在
yyyyymdd
范围内搜索日期。我还发现它们的结果略有不同,所以我开始进一步研究这个问题

我检查了数据库(在MS SQL Server上运行),它将日期作为字符串存储在正在搜索的字段中的
yyyyMMdd
格式中

在使用
yyyy-MM-dd
格式的报告中,Crystal reports进行的SQL查询包含

WHERE ("Remiss_ank"."Skapad_datum">='2013-07-01' 
  AND "Remiss_ank"."Skapad_datum"<='2013-07-31')
由于数据库中的所有日期都是以
yyyyMMdd
格式存储的,我可以理解前者是否不会给出任何结果,但它实际上返回后者的一个子集。事实上,第一个查询返回日期在20130702到20130731之间的所有记录


有人能解释为什么我看到这个结果,为什么字符串
2013-07-02
被认为是字符串间隔
20130701
20130731
的一部分,而
2013-07-01
不是。

这是因为您将日期存储为字符串。不要那样做。存在日期和日期时间数据类型是有原因的

试试看这个

if ('20130701'>='2013-07-01') select '1'
if ('20130702'>='2013-07-01') select '2'
如果您坚持,请尝试更改排序规则

if ('20130701'>='2013-07-01' collate Latin1_General_CI_AI ) select '1a'
if ('20130701'>='2013-07-01' collate SQL_Latin1_General_CP1_CI_AS ) select '1b'

我完全了解
date
datetime
数据类型,日期不应存储为字符串。不幸的是,提供LIS软件的公司似乎不是,我不得不接受这一点。下周我回去工作时,我会检查你建议的代码。我仍然不明白为什么任何排序都会说
20130701<2013-07-01<20130702<2013-07-02
if ('20130701'>='2013-07-01' collate Latin1_General_CI_AI ) select '1a'
if ('20130701'>='2013-07-01' collate SQL_Latin1_General_CP1_CI_AS ) select '1b'