0

问题:

我们有一些产品使用“YYWW”( date('yW')) 格式来标识创建日期。
有时我们甚至没有得到星期.. 我们所要处理的只是年份值。

我目前正在使用DateTime->setISODate()从年份和周值中获取日期。
由于新年之交通常在日历周的中间,因此在考虑第一周时,我们的最短日期通常在前一年。
这本身并不是什么大问题,当尝试转换回原始日期代码字符串时,我会得到错误的年份值。

目标:

我们的目标是

  1. 将给定的 YYWW 值作为两个值存储到数据库中,它们的最早最晚可能的日期。
  2. 然后,根据这些最小/最大日期,在需要查看时准确地重建原始年/周字符串。

示例: “代码”到“日期”:OK

  • 代码“09”变为最小值 2008-12-29 / 最大值 2009-12-27
  • 代码“0901”变为最小值 2008-12-29 / 最大值 2009-01-04
  • 代码“0922”变为最小值 2009-05-25 / 最大值 2009-05-31


示例: “日期”到“代码”:失败

  • 日期 2009-12-27 = "0952" ... 成功
  • 日期 2009-05-31 = "0922" ... 成功
  • 日期 2009-05-25 = "0922" ... 成功
  • 日期 2009-01-04 = "0901" ... 成功
  • 日期 2008-12-29 = "0801" ... 失败:预期为 "0901"

试过:

### Simplified for brevity ###

$dateOfMfg = '0901';

$dc  = aCustomValidatorAndStuff($dateOfMfg); // returns array('year' => 2009, 'week' => 1)

$dateTimeMin = new DateTime();
$dateTimeMax = new DateTime();

$result = array(
    'min' => $dateTimeMin->setISODate($dc['year'], $dc['week'], 1),
    'max' => $dateTimeMax->setISODate($dc['year'], $dc['week'], 7),
);

echo '<pre>Result:<br />',var_dump($result),'</pre>';
echo 'Min: ',$result['min']->format('yW'),'<br />';  // "0801" ... Bad
echo 'Min: ',$result['max']->format('yW'),'<br />';  // "0901" ... Good

概括:

有没有一种本地方法可以为那个“最小”年获得适当的年份值?
想到了什么其他建议?

4

1 回答 1

0

我认为在数据库中存储日历表在这里最有意义。日历表可以大大简化您的代码。针对日历表编写的查询通常显然是正确的。这其中有很多价值。

使用日历表回答失败问题的一种方法是返回完整的日期集。

select cal_date
from calendar
where iso_year = (select iso_year from calendar where cal_date = '2008-12-29')
  and iso_week = (select iso_week from calendar where cal_date = '2008-12-29')
order by cal_date;

cal_date
--
2008-12-29
2008-12-30
2008-12-31
2009-01-01
2009-01-02
2009-01-03
2009-01-04

我认为该语句更容易理解,但 JOIN 通常表现更好。

select c2.cal_date
from calendar c1
inner join calendar c2 
        on c1.iso_year = c2.iso_year
       and c1.iso_week = c2.iso_week
where c1.cal_date ='2008-12-29'
order by c2.cal_date;

需要考虑的事情

代码“09”变为最小值 2008-12-29 / 最大值 2009-12-27

ISO 2009 年从 2008 年 12 月 29 日开始,但不会在 2009 年 12 月 27 日结束。它于 2010-01-03 结束;

于 2013-06-25T21:31:04.023 回答