检查时间戳的年份
Check the year of timestamps
我在我的数据库中存储了时间戳。 483753600
、799286400
等时间戳
我想检查 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();
}
我在我的数据库中存储了时间戳。 483753600
、799286400
等时间戳
我想检查 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();
}