【问题标题】:MySQL SELECT using WHERE & BETWEENMySQL SELECT 使用 WHERE 和 BETWEEN
【发布时间】:2017-12-02 23:51:11
【问题描述】:

我有多个结构相同的数据库:

dsid、标签、时间戳、值

时间戳在 unixtime 中,我可以像这样选择数据来绘制:

SELECT CONCAT(t.`dsid` ,' - ', t.`dsid` - 1) AS `DSIDs`
 , t.`value` - (SELECT `value`
                FROM `MY-DB` 
                WHERE `dsid` = t.`dsid` - 1 * 20) AS `kWh`,
                tag, dsid, value,
                FROM_UNIXTIME(timestamp, '%y-%d-%m %H:%i')
FROM `MY-DB` t limit 10000;

但我想根据“日期之间的位置”结构来选择它,所以我可以选择一个月或一周……甚至更好的“最后”周、月、年(整个日历年或仅过去 12月)。

但如果我这样尝试它会失败:

SELECT CONCAT(t.`dsid` ,' - ', t.`dsid` - 1) AS `DSIDs`
 , t.`value` - (SELECT `value`
                FROM `MY-DB` 
                WHERE `dsid` = t.`dsid` - 1 * 20) AS `kWh`,
                tag, dsid, value, (FROM_UNIXTIME(timestamp, '%y-%d-%m %H:%i') WHERE 'timestamp' BETWEEN UNIX_TIMESTAMP('16-27-03 23:45')) AND UNIX_TIMESTAMP('16-25-02 00:00')
FROM `MY-DB` t limit 10000;

怎么了?

【问题讨论】:

  • 那么你发现谷歌搜索从日期和时间段数转换为日期是什么?谷歌我的 cmets 重新搜索一个问题的许多措辞/版本。另外,“失败”是什么意思?请对minimal reproducible example采取行动。 PS 你可能不想要 SQL between,因为它是包容性的。
  • 我发现了几个不同版本和文档示例的用法,但没有一个对我有用,或者我使用错误的方式。失败意味着:[代码:1064,SQL 状态:42000] 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 'WHERE 'timestamp' BETWEEN UNIX_TIMESTAMP('16-27-03 23:45')) AND UNIX_TIMESTAMP('' at line 5 附近使用正确的语法
  • 没有选择匹配第二个代码块中的最终位置。请注意,froms & any joins & any where 通常缩进相同的数量。请参阅我对您的发件人的编辑。将来切掉一些东西,直到您没有收到错误以对其进行本地化。每 minimal reproducible example 你在这里仍然缺少。 PS编辑你的问题,不要在cmets中澄清。
  • 感谢您帮助我解决这个问题,再过 5 分钟就搞定了!
  • 嗨。请将您的解决方案作为答案发布,然后在最短的等待时间后接受它,以表明您已找到解决方案。单击“已编辑”链接以获取未格式化的文本。然后点击之前版本的“回滚”。请注意,通常如果像这里的答案结果是存在拼写错误或简单的语法问题,则该问题将被具有足够声誉的后来读者投票关闭(无法获得进一步的答案)。下次记得——MCVE。

标签: mysql unix-timestamp


【解决方案1】:

问题是我将 WHERE & BETWEEN 放在了错误的位置,这对我来说是这样的:

SELECT CONCAT(t.`dsid` ,' - ', t.`dsid` - 1) AS `DSIDs` , t.`value` - (SELECT `value`
            FROM `MYDB` 
            WHERE `dsid` = t.`dsid` - 1 * 20) AS `kWh`,
            tag, dsid, value,
            FROM_UNIXTIME(timestamp, '%y-%m-%d %H:%i') as time
FROM `MYDB` t
WHERE timestamp
BETWEEN UNIX_TIMESTAMP('16-08-01') AND UNIX_TIMESTAMP('16-08-31 23:59:59')

可能不是最有效的方法..

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多