按日分组Unix时间戳生成不均匀的间隔组

时间:2011-06-06 11:28:19

标签: mysql sql datetime group-by timestamp

我正在使用MySQL查询将一系列日期时间作为Unix时间戳(因为我将它们转换为Javascript时间)。我按'FROM_UNIXTIME'分组如下:

SELECT 
    UNIX_TIMESTAMP(DateAndTime) as x, 
    Sum(If(Pass='Pass',1,0)) AS y, 
    Sum(If(Pass='Fail',1,0)) AS z, 
    Sum(If(Pass='Fail',1,0))/(Sum(If(Pass='Pass',1,0))+Sum(If(Pass='Fail',1,0))) AS a,
    cases.primaryApp 
FROM casehistory, cases
WHERE DATE_SUB(CURDATE(),INTERVAL 80 DAY) <= DateAndTime
AND cases.caseNumber = casehistory.caseNumber
AND cases.primaryApp = 'Promo'
GROUP BY FROM_UNIXTIME(x, '%Y-%m-%d')

虽然我希望我的时间戳能够均匀地返回(即每天/每组之间的时间相同),但我得到以下系列:

  

1300488140,1300501520,   1300625099,130​​0699980

查询中的所有其他数据都是正确的,但由于时间戳的间距不规则,基于这些标记的条形图看起来非常糟糕。也许我在应用分组的方式上做错了什么?


感谢您的回复。我的查询“有意义”,因为它生成了可以绘制的(分组是在日期和时间值的x别名上完成的),但问题是从数据库中提取Unix时间戳并按天分组返回了一系列时间戳它们之间没有相同的距离。

我通过从日期时间MySQL字段中拉出一天(没有时间)来解决这个问题,然后 - 在PHP中 - 将空白时间连接到日期,将结果字符串转换为时间,然后将整个shebang乘以1000返回图表所需的Javascript时间,如下所示:

x = x . ' 00:00:00';
x = strtotime(x) * 1000;

答案让我走上正轨;我会接受的。我的图表现在看起来很完美。

1 个答案:

答案 0 :(得分:1)

问题很困惑。

您的SQL语句没有意义 - 您正在按select语句中找不到的实体进行分组。条形图绘制了一组有序的值 - 所以如果有一些有趣的间距,那么它实际上不是条形图。

但我认为你要找的答案是:

SELECT DATE_FORMAT(dateandtime, '%Y-%m-%d') as ondate
, SUM(IF(Pass='Pass',1,0)) AS passed
, SUM(IF(Pass='Fail',1,0)) AS failed
, SUM(IF(Pass='Fail',1,0))
  /(SUM(IF(pass='Pass',1,0))+SUM(IF(Pass='Fail',1,0))) AS fail_pct
, cases.primaryapp 
FROM casehistory, cases
WHERE DATE_SUB(CURDATE(),INTERVAL 80 DAY) <= dateandtime
AND cases.casenumber = casehistory.casenumber
AND cases.primaryapp = 'Promo'
GROUP BY DATE_FORMAT(dateandtime, '%Y-%m-%d')
ORDER BY 1;

如果您需要Unix时间戳,请将上面的内容包装在....

SELECT UNIX_TIMESTAMP(STR_TO_DATE(CONCAT(ilv.ondate, ' 00:00:00'))) AS tstamp
, passed
, failed
, fail_pct
, primaryapp
FROM (
     ...
) AS ilv

请注意,您仍然会在DST开关周围出现异常情况。

下进行。