1

我整天都在努力解决这个问题,并尝试了我知道的所有可能的方法。问题是:

我正在研究的领域有这样的格式:

XXX 年示例:001-2014(字符串)

假设我们有这些记录:

  • 001-2014
  • 011-2014
  • 013-2013

我期望得到的结果是 011-2014 (换句话说,价值最大的最早年份)

我写了这个在 PostgreSql 上运行良好的查询:

select split_part(numero_bl, '-', 1) as part1, 
       split_part(numero_bl, '-', 2) as part2 
       from livraisons 
ORDER BY part2 desc,part1 desc limit 1

split_part 函数将列 'numero_bl' 拆分为 2 个部分。所以结果是这样的:

第1部分| 第2部分

001 | 2014

当我尝试在 Python 代码中引入它时,它使用升序返回正确的值,但在降序时返回 ('None',)

这是我在 python 中的函数的简单版本:

def set_numero_bl(self, cr, uid, ids,name,arg,context=None):
        res={}   
        cr.execute("""select split_part(numero_bl, '-', 1) as part1,
                    split_part(numero_bl, '-', 2) as part2 
                    from livraisons 
                    ORDER BY part2 desc,part1 desc limit 1""")
        execution = cr.fetchone()
        part1 = execution[0]
        part2 = execution[1]
        if part1:
              if part2:
                annee = int(part2)
                nombre = int(part1)+1
                valeur_final= str('%0*d' % (3, nombre))+"-"+str(annee)
                for livraisons in self.browse(cr, uid, ids):
                    res[livraisons.id]= valeur_final
        else: 
            valeur_final= str('%0*d' % (3, 1))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y')
            for livraisons in self.browse(cr, uid, ids):
                res[livraisons.id]= valeur_final
        return res

当然,当我不放“其他条款”时,它会返回(“无”,)

请问有没有办法修复它或以任何其他方式解决它?

谢谢

4

2 回答 2

0

我找到了解决我的问题的方法。我将查询更改为此

cr.execute("""select max(numero_bl) as part from livraisons 
           where split_part(numero_bl, '-', 2) >= %s""",
        ((datetime.datetime.strftime(datetime.datetime.now(), '%Y')),))

首先,我只保留年份部分大于当前年份的记录,之后我取字段“numero_bl”的最大值

如果有人感兴趣,这是完整的代码:

 def set_numero_bl(self, cr, uid, ids,name,arg,context=None):
    res={}   
    cr.execute("""select max(numero_bl) as part 
                 from livraisons 
        where split_part(numero_bl, '-', 2) >= %s""", 
        ((datetime.datetime.strftime(datetime.datetime.now(), '%Y')),)) 
    valeur = cr.fetchone()[0]
    if valeur:
        value = valeur.split('-'); 
        nombre = int(value[0])+1
        valeur_final= str('%0*d' % (3, nombre))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y')
        for livraisons in self.browse(cr, uid, ids):
            res[livraisons.id]= valeur_final
    else: 
        valeur_final= str('%0*d' % (3, 1))+"-"+datetime.datetime.strftime(datetime.datetime.now(), '%Y')
        for livraisons in self.browse(cr, uid, ids):
            res[livraisons.id]= valeur_final
    return res

谢谢大家的回复

于 2014-02-26T11:09:31.290 回答
0

该列中有空值。当您要求降序时,空值将首先出现:

select *
from (values (1), (null)) s(a)
order by a desc;
 a 
---

 1
(2 rows)

如果您想保留空值,请告诉它最后订购空值

select *
from (values (1), (null)) s(a)
order by a desc nulls last;
 a 
---
 1

(2 rows)

或者只是过滤掉空值

select *
from (values (1), (null)) s(a)
where a is not null
order by a desc;
 a 
---
 1
(1 row)
于 2014-02-26T10:53:11.750 回答