检查时间戳的年份

Check the year of timestamps

我在我的数据库中存储了时间戳。 483753600799286400 等时间戳

我想检查 2015 年是否与我的任何时间戳匹配。

我知道我可以做到的唯一方法是从数据库中获取 ALL 时间戳,然后使用 getdate(799286400)['year'] 检查每个时间戳的年份.这将是一个解决方案,但它对性能来说太糟糕了!还有其他更温和的方法吗?

更新

这是我目前尝试过的方法:

public function dateOfBirth(string $year): array {
    return $query = $this->createQueryBuilder('p')
            ->select('p.uid')
            ->where("p.dateOfBirth BETWEEN :start AND :end")
            ->setParameter('start', "$year-01-01")
            ->setParameter('end', "$year-01-01")
            ->getQuery()
            ->getResult();
}

但它 returns 是一个空数组。

您似乎正在存储纪元时间戳。要检查属于 2015 年的时间戳,一种有效的方法是生成一系列代表年份边界的纪元时间戳,然后将其与存储的值进行比较。假设时间戳存储在列 col:

select exists (
    select 1
    from mytable    
    where col >= unix_timestamp('2015-01-01') and col < unix_timestamp('2016-01-01')
) as exists_year_2015

此查询将为您提供一个唯一记录,其中一个唯一列包含一个布尔值 (0/1),指示 table 中是否有任何记录具有属于 2015 年的时间戳。

这样的表达式将能够利用时间戳列上的索引。

你的代码有几个问题,首先你要返回一个作业

return $query = $this->createQue...

你还为:start:end设置了相同的参数值,字符串"$year-01-01"与存储的时间戳不匹配,你不改变值$year 介于两者之间,所以即使它可以匹配,它也将是一个空范围。

您需要确定给定年份的开始和结束时间戳,并将它们用作查询的参数。

public function dateOfBirth(string $year): array {
    // get the DateTimes
    $startDate = new \DateTime("midnight January 1, $year");
    $year += 1;
    $endDate = new \DateTime("midnight January 1, $year");
    // get the timestamps
    $start = $startDate->format('U');
    $end = $endDate->format('U');

    return $this->createQueryBuilder('p')
            ->select('p.uid')
            ->where("p.dateOfBirth > :start")
            ->andWhere("p.dateOfBirth < :end")
            ->setParameter('start', $start)
            ->setParameter('end', $end)
            ->getQuery()
            ->getResult();
}