【问题标题】:Using MAX() function with flawed field使用带有缺陷字段的 MAX() 函数
【发布时间】:2012-06-20 16:47:37
【问题描述】:

样本数据

表 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. 单个记录有时在table.DateTime_Fromtable.DateTime_To 下都有时间值00:00:00,例如见table 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) 时会出现问题。

问题

  1. 有没有办法解决使用MAX (table.DateTime_From) 观察到的问题,这样我就可以得到07/06/2001 00:00:00 - 即使它对07/06/2001 24:00:00 的表示非常差。

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

【问题讨论】:

  • 您是否将时间戳存储为字符串?您无法有意义地比较这些日期,因为31/01/2001 会比01/12/2001“更大”。
  • 时间戳不是字符串。时间戳存在于专门定义为 SQL Server 表上的日期时间值的字段中。
  • 此外,服务管理系统 (SMS) 正在使用该表,因此更改表甚至不是一个选项 - 假设出现。 SMS 非常善变,因此我通常倾向于“仅”从中读取数据……然后尝试使用 SQL 来处理选定的数据。
  • 24:00:00 不是有效的日期时间。 SQL Server 日期时间部分从 00:00:00 到 23:59:59.997。
  • 时间戳24:00:00 包含在说明中,只是为了帮助人们理解00:00:00 在表格中的另一个上下文中的含义。

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


【解决方案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 列吗?

【讨论】:

  • 您的代码逻辑似乎与@X-Zero 建议的相似。唯一的问题是,有时00:00:00 真的意味着00:00:00。然而在其他时候00:00:00 意味着24:00:00 - 因此为什么要仔细考虑这个想法。
  • 好的,但是你怎么知道它的真正含义呢?
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多