我有一个语法,NAS,mariadb,有巨大的蜱虫数据。我想每天在16:00 US/Eastern
制作一张标价的桌子。
在没有时区考虑的情况下,每天在10:05 GMT
上很容易得到带有滴答声的表格:
SELECT
TIMESTAMP,
DATE(FROM_UNIXTIME(TIMESTAMP / 1000)) DATE,
TIME(FROM_UNIXTIME(TIMESTAMP / 1000)) TIME,
PRICE
FROM DATASET.TICK
WHERE
# 10:05:00 <= GMT < 10:07:00
MOD(TIMESTAMP, 86400000) >= 79500000
AND
MOD(TIMESTAMP, 86400000) < 79620000
GROUP BY DATE;
似乎最简单的方法是使用mysql_tzinfo_to_sql
,然后与CONVERT_TZ(Timestamp, 'UTC', 'US/Eastern')
一起使用。但我在NAS里有命令。
-sh: mysql_tzinfo_to_sql: command not found
-sh: mariadb-tzinfo-to-sql: command not found
由于US/Eastern
中在17:00到18:00之间没有数据,所以我可能会想出一种愚蠢而缓慢的方法(也许不是在mysql中)。但是我想看看是否有更聪明的方法在我的设置中通过mysql来实现呢?
更新v1:
关于mysql_tzinfo_to_sql: command not found
的问题。我已经用我的Ubuntu机器处理了它。
设置:
(ssh,mariadb)
步骤:
zoneinfo
目录从NAS复制到计算机:例如scp -r user@192.168.1.2:/usr/share/zoneinfo ~/Documents
mysql
数据库:例如mysql_tzinfo_to_sql zoneinfo | mysql -u root -h 192.168.1.2 -p mysql
现在,可以使用CONVERT_TZ()
。由于‘US/ exist’不存在于时区表中,所以我选择了America/New_York
。因此,从我以前的代码中直接转换成:
SELECT
TIMESTAMP,
DATE(CONVERT_TZ(FROM_UNIXTIME(TIMESTAMP / 1000), 'SYSTEM', 'America/New_York')) DATE,
TIME(CONVERT_TZ(FROM_UNIXTIME(TIMESTAMP / 1000), 'SYSTEM', 'America/New_York')) TIME,
PRICE
FROM DATASET.TICK
WHERE
# 16:00:00 <= America/New_York < 16:00:05
TIME(CONVERT_TZ(FROM_UNIXTIME(TIMESTAMP / 1000), 'SYSTEM', 'America/New_York')) BETWEEN CAST('16:00:00' AS TIME) AND CAST('16:00:05' AS TIME)
GROUP BY DATE, CODE
TIME
列每天可显示16:00。虽然这部分已经解决了,但这只适用于一张小桌子,而我现在正忍受着
error 1206: The number of locks exceeds the lock table size.
我可以看到,这种转换是乏味和低效的。但是,我最好的猜测或下一步是向表中添加基于Timezone的日期和时间列。
发布于 2022-02-06 06:03:11
让我们同时解决第二个问题。
你想要最后一个条目,比如说,10:07:00
。也许你的意思是“pm”?这样就解决了失踪的条目问题。以及人工时间范围内的多个条目。
但这带来了另一种糟糕的局面这是一个"groupwise-max“问题;请参阅我添加的标记。
或者看看我在中描述的高效算法中哪一个最适合您的情况。注意,您将需要为任何解决方案添加一个INDEX
,该操作将花费大量时间。
您提到了DST,但是让我们通过简单地要求23:59:59
之前每天的最后一个条目来消除这个问题。这假设你想要“市场收盘”,并且在收盘后没有交易。而且,它也不在乎那些愚蠢的日光储蓄是否有效。
https://stackoverflow.com/questions/71004200
复制相似问题