【问题标题】:GROUP BY 不同日期的最大和最小数字
【发布时间】:2022-01-20 17:47:03
【问题描述】:

我正在尝试查询这个每小时价格日期的数据集。该数据集定义了 UTC 时间上午 12 点至凌晨 12 点的每日价格,我试图定义 UTC 时间下午 4 点至下午 4 点的天数。因此,我需要在 ex: '2021-12-15 16:00:00' 和 '2021-12-16 15:00:00' 之间获取每天的最高价和最低价,因为这将是开盘价和收盘价交易日。

我现在有这个:

SELECT convert(date,dateadd(S, TimeStamp/1000, '1970-01-01')) as 'date' 
,symbol
,Max([high])    as 'Max'
,Min([low])     as 'Min'
FROM [Crypto].[tblMessariPriceHistory]
WHERE symbol = 'DOGE'
and dateadd(S, TimeStamp/1000, '1970-01-01') between '2021-12-15 16:00:00' and '2021-12-16 15:00:00'
Group By convert(date,dateadd(S, TimeStamp/1000, '1970-01-01')),symbol

但结果是这样的:

date symbol Max Min
2021-12-15 DOGE 0.175059052503167 0.170510833636204
2021-12-16 DOGE 0.180266282681554 0.177596458601872

我可以只按符号分组,但我希望能够在几天内完成此操作,但这是行不通的。

关于如何将选定的日期范围定义为多天的组或表有什么想法吗?

【问题讨论】:

  • 添加到1970-01-01 15:00而不是1970-01-01

标签: sql datetime group-by


【解决方案1】:

如果你考虑一下,每次减去 16 小时,就会将时间滑回到“开始日”中的某个时间

Monday 16:00 becomes midnight Monday
Monday 23:59 becomes 7:59 Monday
Tuesday 00:00 becomes 8:00 Monday
Tuesday 15:59 becomes 23:59 Monday
Tuesday 16:00 becomes midnight Tuesday

无论如何,一旦您将时间向后滑动 16 小时,您可以通过将 unix 时间戳除以一天中的毫秒数以及周一 16:00 和周二 15 之间的所有交易来缩短时间部分: 59:59.999 将下降为“星期一”。如果它是 DateTime,我们可以将其转换为 Date 以实现相同的目的。找到将日期时间视为十进制数字的方法很方便,其中整数是日期,小数是时间,因为将其切碎为 int 会丢弃时间并允许每日汇总。如果您想按小时汇总,调整数字使其代表小时数和一小时的分数(除以 3600000,一小时中的毫秒数)有助于达到同样的目的

--take off 16h then truncate to number of days since epoch 
SELECT 
  (timestamp-57600000)/86400000 as timestamp, 
  symbol,
  min(low) as minlow,
  max(high) as maxhigh 
FROM trades
GROUP BY (timestamp-57600000)/86400000 as timestamp, symbol

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2012-07-16
    • 2020-06-24
    相关资源
    最近更新 更多