在下面的查询中,我使用了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);
}
任何人都可以帮我吗?
答案 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();