使用带有缺陷字段的MAX()函数

时间:2012-06-19 15:00:32

标签: sql sql-server-2008 tsql crystal-reports-2008

样本数据

表1

table.DateTime_From          |         table.DateTime_To
-----------------------------|--------------------------------
01/05/2001 00:00:00          |         01/05/2001 08:00:00
01/05/2001 08:00:00          |         01/05/2001 18:00:00
01/05/2001 18:00:00          |         01/05/2001 00:00:00
03/05/2001 00:00:00          |         03/05/2001 12:00:00
03/05/2001 12:00:00          |         03/05/2001 15:00:00
03/05/2001 15:00:00          |         03/05/2001 00:00:00
07/05/2001 00:00:00          |         07/05/2001 00:00:00
06/05/2001 00:00:00          |         06/05/2001 00:00:00
05/06/2001 00:00:00          |         05/06/2001 00:00:00
07/06/2001 00:00:00          |         07/06/2001 11:00:00
07/06/2001 11:00:00          |         07/06/2001 14:00:00
07/06/2001 14:00:00          |         07/06/2001 00:00:00

上表包含以下属性:

  1. 对于每条记录table.DateTime_From< = table.DateTime_To
  2. 时间值24:00:00遗憾地有时表示为00:00:00,例如比较table 2table 3 - 这是无法更改的,因此更改此内容甚至不是一种选择。
  3. 单个记录有时在00:00:00table.DateTime_From下都有时间值table.DateTime_To,例如见table 4
  4. 表2

    table.DateTime_From          |         table.DateTime_To
    -----------------------------|--------------------------------
    01/05/2001 18:00:00          |         01/05/2001 00:00:00
    

    表3

    table.DateTime_From          |         table.DateTime_To
    -----------------------------|--------------------------------
    01/05/2001 18:00:00          |         01/05/2001 24:00:00
    

    表4

    table.DateTime_From          |         table.DateTime_To
    -----------------------------|--------------------------------
    07/05/2001 00:00:00          |         07/05/2001 00:00:00
    

    观察

    1. 使用MIN (table.DateTime_From)可获得01/05/2001 00:00:00

    2. 尝试使用MAX (table.DateTime_To)会产生问题,因为这会产生07/06/2001 14:00:00 - 尽管这实际上应该是07/06/2001 00:00:00,即07/06/2001 24:00:00

    3. 请注意,07/06/2001 24:00:00表示为07/06/2001 00:00:00 - 因此使用MAX (table.DateTime_From)时出现问题。

    4. 问题

      1. 是否可以解决使用MAX (table.DateTime_From)时遇到的问题,以便我能够获得07/06/2001 00:00:00 - 即使07/06/2001 24:00:00代表性很差

      2. 或者是否有一些我不理解的基本细节......

1 个答案:

答案 0 :(得分:1)

为什么不创建一个类似于此的视图(在SQL Server方言中)

SELECT table.DateTime_From
 , table.DateTime_To
 , CASE 
    WHEN DATEPART(table.DateTime_From, hour) = 0 
        AND DATEPART(table.DateTime_From, minute) = 0
        AND DATEPART(table.DateTime_From, second) = 0 
      THEN DATEADD(day, 1, table.DateTime_From)
    ELSE table.DateTime_From
   END AS DateTime_From_Corrected
 , CASE 
    WHEN DATEPART(table.DateTime_To, hour) = 0 
        AND DATEPART(table.DateTime_To, minute) = 0
        AND DATEPART(table.DateTime_To, second) = 0 
      THEN DATEADD(day, 1, table.DateTime_To)
    ELSE table.DateTime_To
   END AS DateTime_To_Corrected
FROM MyData table

然后您可以在查询中使用Corrected列?