sql问题

我想实现动态轮播折线图,在帮助文档中看到实例(https://help.finereport.com/doc-view-3259.html),但是对以下这句不太理解,求高手解答。

where strftime('%Y-%m',订购日期)<='${left(monthdelta("1997-01-01",mod((datetonumber(now())-datetonumber(a))/1000,12)),7)}'


handada 发布于 2020-9-2 17:00
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
1
影丶Lv5高级互助
发布于2020-9-2 17:13(编辑于 2020-9-2 17:20)

以下解释供参考:

${left(monthdelta("1997-01-01",mod((datetonumber(now())-datetonumber(a))/1000,12)),7)}:

datetonumber(now()):获取当前系统时间,并转换成毫秒数

datetonumber(a):获取模板初始化的系统时间,并转换成毫秒数

(datetonumber(now())-datetonumber(a))/1000:计算时间差,并换算成秒

mod((datetonumber(now())-datetonumber(a))/1000,12):取余,即计算间隔的月份数

monthdelta("1997-01-01",mod((datetonumber(now())-datetonumber(a))/1000,12)):计算间隔n个月后的年月日(开始日期为1997-01-01,n为上面公式的取余结果)

left(monthdelta("1997-01-01",mod((datetonumber(now())-datetonumber(a))/1000,12)),7):截取前7位,得到年-月格式的数据

  • handada handada(提问者) 我用MySQL试了一下, SELECT MOD((UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(\'2020-09-01 17:22:38\')),12) 取余的结果为什么会一直变呢?从0变到11,一直循环。如果说是计算的月份差,不应该是0么?
    2020-09-02 17:36 
  • 影丶 影丶 回复 handada(提问者) 这个是会一直变的,因为第一个是取的系统时间,每次重新获取时都不一样,第二个获取的时间是固定的,他们之间的差值是会跟随时间变化的,再去取余也就会跟着变化
    2020-09-02 17:47 
最佳回答
1
machengLv3见习互助
发布于2020-9-2 17:11

strftime('%Y-%m',订购日期)这个获取订购日期字段的年月 比如订购日期的值是1997-01-31 那么获取的是 1997-01
${left(monthdelta("1997-01-01",mod((datetonumber(now())-datetonumber(a))/1000,12)),7)}主要是格式转换

最佳回答
1
snrtuemcLv8专家互助
发布于2020-9-2 17:11

strftime('%Y-%m',订购日期)是将订购日期转换成2020-09格式

left(XXX,7)是取左边开始7为,就是满足2020-09的格式

monthdelta("1997-01-01",X)是1997-01-01月份加后面数字

mod((datetonumber(now())-datetonumber(a))/1000,12)是当前时间转换成数值,减去一定时间,然后除以12取余数月份

  • 5关注人数
  • 590浏览人数
  • 最后回答于:2020-9-2 17:20
    请选择关闭问题的原因
    确定 取消
    返回顶部