2

我正在更新公司中的一些旧水晶报告,当时我偶然发现有些人正在搜索yyyy-MM-dd范围内的日期,而另一些人正在搜索范围内的日期yyyyMMdd。我还发现它们导致的结果略有不同,所以我开始进一步调查。

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

在使用yyyy-MM-ddCrystal Reports 进行的 SQL 查询的格式的报表中包含

WHERE ("Remiss_ank"."Skapad_datum">='2013-07-01' 
  AND "Remiss_ank"."Skapad_datum"<='2013-07-31')

而使用该yyyyMMdd格式的报告有一个 SQL 查询,其中包含

WHERE ("Remiss_ank"."Skapad_datum">='20130701' 
  AND "Remiss_ank"."Skapad_datum"<='20130731')

由于数据库中的所有日期都以yyyyMMdd我可以理解的格式存储,如果前者根本不会给出任何结果,但它实际上返回后者的子集。事实上,第一个查询返回日期在 20130702 到 20130731 范围内的所有记录。

有人可以解释为什么我看到这个结果,以及为什么字符串2013-07-02被认为是字符串间隔的一部分,2013070120130731不是2013-07-01

4

1 回答 1

1

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

试试这个看看

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'
于 2013-08-02T12:41:42.057 回答