SQL Casting datetime 并将其用于 groupby

Posted

技术标签:

【中文标题】SQL Casting datetime 并将其用于 groupby【英文标题】:SQL Casting datetime and using it for groupby 【发布时间】:2018-08-22 04:05:56 【问题描述】:

试图找出我组织中每个 ID 的小时差。这是我当前的查询:

SELECT Label, SUM(Diff)
FROM (
        select distinct mr.deviceid, TO_CHAR(mr.readdate, 'MM/dd/yyyy HH:00 am') as Label, (MAX(ComputedReading) - MIN(ComputedReading)) AS Diff
        from analytic.twmeterreading as mr
         WHERE mr.ReadDate >= DATEADD(hour, -100, GetDate()) AND mr.ReadDate <= GetDate() and mr.orgunitid = 1
         group by mr.deviceid, Label
         order by label
     ) as ReadData
GROUP BY deviceid, Label
ORDER BY Label

数据类型有:

读取日期:日期时间

设备ID:整数

readdate 将以这种格式返回:

2018-08-17 07:01:16
2018-08-17 08:00:18
2018-08-17 14:59:41
2018-08-17 12:34:17
2018-08-17 06:02:06
2018-08-17 01:58:54
2018-08-17 12:02:14
2018-08-17 15:01:22
2018-08-17 11:03:16
2018-08-17 05:59:05
2018-08-17 14:02:29
2018-08-17 07:01:09
2018-08-17 09:58:17
2018-08-17 11:56:42
2018-08-17 02:01:13
2018-08-17 15:03:28
2018-08-17 06:03:45
2018-08-17 17:01:22

当我从查询中排除 :00 am 时,我会返回结果。我无法弄清楚为什么将这些作为查询结果的一部分添加为全 0。

示例: 对于这种类型:TO_CHAR(mr.readdate, 'MM/dd/yyyy') as Label

结果是这样的:

    label   sum
08/18/2018  108
08/18/2018  3
08/18/2018  254
08/18/2018  50
08/18/2018  229
08/18/2018  983
08/18/2018  434
08/18/2018  64
08/18/2018  2
08/18/2018  0
08/18/2018  370

当我这样做时:TO_CHAR(mr.readdate, 'MM/dd/yyyy hh:00 AM') as Label 我把总和全部归为 0

有什么想法吗?顺便说一句,如果重要的话,这是在红移上

【问题讨论】:

为什么'MM/dd/yyyy HH:00 am'。为什么不'MM/dd/yyyy HH:MI am' 我试图不包括会议记录。只是纯粹的日期和时间 那么,'MM/dd/yyyy HH am' ? 总和仍然为零。不太清楚为什么在最后添加 am 时总和不会发生 为什么在子选择中包含deviceid,如果最后不使用GROUP BY?为什么ORDER BY 在子选择中?另外,不要使用DISTINCTGROUP BY 【参考方案1】:

我不清楚你到底想要什么,但这里有一个似乎可行的例子:

SELECT deviceid, Label, SUM(Diff)
FROM (
        SELECT 
          mr.deviceid, 
          mr.readdate::date as Label, 
          (MAX(ComputedReading) - MIN(ComputedReading)) as Diff 
        FROM   twmeterreading as mr
        WHERE  mr.ReadDate::date >= current_date  
        AND    mr.ReadDate::date <= current_date 
        AND    mr.orgunitid = 1
        GROUP BY mr.deviceid, Label
     ) as ReadData
GROUP BY deviceid, Label
ORDER BY Label

实时代码:http://sqlfiddle.com/#!15/8f3c0/2

我使用了 postgresql,因为它似乎最接近 redshift。请注意,日期转换函数有点不同。

请评论它与您要求的答案有多接近,我会进行调整。

【讨论】:

您好,感谢您的回复。它相当接近。我感兴趣的是试图在过去的 24 小时内以小时为单位获得它。当我将上面的逻辑修改为 to_char(date, 'hh am') 时,它会全部返回 12。不太清楚为什么。会认为是凌晨 1 点、下午 5 点等 抱歉,我应该更正一下。它确实以正确的时间返回,它是 diff 列,总是以 0 的形式出现 做更多的挖掘,所以实际上每个小时都有一个记录,这就是它返回为 0 的原因。如果存在,有没有一种简单的方法可以与前几个小时的记录进行比较?

以上是关于SQL Casting datetime 并将其用于 groupby的主要内容,如果未能解决你的问题,请参考以下文章

来自带有时区的 SQL Server 的 DateTime

将 0 转换为 DATE 和 DATETIME

在 C# 中将字符串转换为 DateTime 并写入 SQL

使用 C# 将 DateTime 格式转换为 SQL 格式

Linq-to-SQL 和 DateTime 的怪异

DateTime格式与SQL SERVER 2012中的预期格式不匹配