【问题标题】:Crystal Reports SQL query give strange results - can someone explain why?Crystal Reports SQL 查询给出奇怪的结果 - 有人可以解释为什么吗?
【发布时间】:2013-08-03 13:40:26
【问题描述】:

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

我检查了数据库(在 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 格式的报告有一个包含

的 SQL 查询
WHERE ("Remiss_ank"."Skapad_datum">='20130701' 
  AND "Remiss_ank"."Skapad_datum"<='20130731')

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

谁能解释我为什么看到这个结果,以及为什么字符串 2013-07-02 被认为是字符串区间 2013070120130731 的一部分,而 2013-07-01 不是。

【问题讨论】:

    标签: sql sql-server string date crystal-reports


    【解决方案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'
    

    【讨论】:

    • 我完全了解 datedatetime 数据类型,并且日期不应存储为字符串。不幸的是,提供 LIS 软件的公司似乎不是,我不得不忍受这种情况。下周我回去工作时会检查你建议的代码。我仍然不明白为什么任何排序规则都会说20130701 &lt; 2013-07-01 &lt; 20130702 &lt; 2013-07-02
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2012-01-21
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多