to_char函数给出了语法错误

时间:2018-06-13 18:28:37

标签: postgresql sqlite to-char

在下面的查询中,我使用了strftime函数来获取字符串格式的日期。它在sqlite数据库中运行良好。但是当数据库更改为进度时,它会抛出一个错误“SQLSTATE [42883]:未定义的函数:7错误:函数strftime(未知,没有时区的时间戳)不存在”

以下代码在SQLite中有效,并在Postgres数据库中引发错误

public function testArchiveSidebar()
{
    $archives = Question::query()->selectRaw('strftime(? ,created_at)as year,
        strftime(?,created_at) as month,count(id) as qcount' ,['%Y','%m'])
        -> groupBy('year','month')
        ->orderByDesc('created_at')
        ->get();
    $this->assertTrue($archives->count()>0);
}

所以,我使用了to_char函数而不是strftime。但是,它正在抛出错误。

SQLSTATE [HY000]:一般错误:1没有这样的列:YYYY(SQL:选择to_char(created_at,YYYY)年,to_char(created_at,Mon)月份从“问题”组中按“年”,“月”顺序通过“created_at”desc)

使用to_char查询

public function testArchiveSidebar()
    {
        $archives = Question::query()->selectRaw('to_char(created_at ,YYYY) year,
                    to_char(created_at ,Mon) month,count(id) as qcount')
            -> groupBy('year','month')
            ->orderByDesc('created_at')
            ->get();
        $this->assertTrue($archives->count()>0);
    }

任何人都可以帮我吗?

3 个答案:

答案 0 :(得分:1)

你需要传递文字:

to_char(created_at, YYYY)     -- before
=>
to_char(created_at, 'YYYY')   -- after
to_char(created_at ,'Mon')

答案 1 :(得分:0)

第二个参数to_char需要的是一个字符串 - 你需要用引号括起来:

$archives = Question::query()->selectRaw("to_char(created_at, 'YYYY') year,
                to_char(created_at, 'Mon') month, count(id) as qcount")

答案 2 :(得分:0)

它使用以下查询。感谢所有提供您的见解。

 $archives = Question::query()->selectRaw("to_char(created_at, 'YYYY') as year,
                to_char(created_at, 'MM') as month,count(id) as qcount")
            -> groupBy('year','month')
            ->orderByRaw('min(created_at) desc')
            ->get();