如何检查每个观察中的最小日期并动态更新标志

时间:2017-08-15 17:38:54

标签: sql-server-2012

我必须每次检查最短日期并添加30天并相应地设置字段。

例如:

我的表:

override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.collectionViewLayout = UICollectionViewFlowLayout()
    self.collectionViewLayout.sectionInset = UIEdgeInsets(top: 1.0, left: 1.0, bottom: 1.0, right: 1.0)
    self.collectionViewLayout.scrollDirection = .vertical

    let frame = CGRect(x: 0.0, y: 0.0, width: self.frame.width, height: self.frame.height)
    self.collectionView = UICollectionView(frame: frame, collectionViewLayout: self.collectionViewLayout)
    self.collectionView?.translatesAutoresizingMaskIntoConstraints = false
    self.addSubview(self.collectionView!)

    NSLayoutConstraint.activate([
        self.collectionView!.topAnchor.constraint(equalTo: self.topAnchor),
        self.collectionView!.bottomAnchor.constraint(equalTo: self.bottomAnchor),
        self.collectionView!.leftAnchor.constraint(equalTo: self.leftAnchor),
        self.collectionView!.rightAnchor.constraint(equalTo: self.rightAnchor),
        ])

    self.collectionView?.dataSource = self
    self.collectionView?.delegate = self
}

所以,这里min(startdate)是2017-01-01。现在我添加了30天,我的查询日期是2017-01-31。对于任何开始日期小于此查找日期的记录,我必须设置flag_1。

我的表格如下:

ID    StartDate     EndDate
1     2017-01-01    2017-02-01
1     2017-01-09    2017-01-28
1     2017-04-01    2017-04-30
1     2017-04-05    2017-05-20
1     2017-04-20    2017-06-12
2     2017-06-02    2017-06-20
2     2017-06-14    2017-07-31
2     2017-06-14    2017-07-31
2     2017-06-19    2017-07-31
2     2017-06-19    2017-07-31

现在我必须寻找下一个最小的开始日期,它比之前的查找日期(2017-01-31)更大。所以我的开始日期是2017-04-01。现在我添加了30天,我的新查询日期是     2017年5月1日。对于少于新查找开始日期的所有记录2017-05-01并且大于先前的查找日期(2017-01-31),该标志将是flag_2,并且该标记将持续相同的ID,直到它到达相同的最后一个记录ID。

我的决赛桌应如下:

ID    StartDate     EndDate               flag
1     2017-01-01    2017-02-01            flag_1
1     2017-01-09    2017-01-28            flag_1
1     2017-04-01    2017-04-30            null
1     2017-04-05    2017-05-20            null
1     2017-04-20    2017-06-12            null
2     2017-06-02    2017-06-20            null
2     2017-06-14    2017-07-31            null
2     2017-06-14    2017-07-31            null
2     2017-06-19    2017-07-31            null
2     2017-06-19    2017-07-31            null

我可以通过下面的代码获得第一组记录,但无法想到在循环中使用它并动态更新标记。

ID    StartDate     EndDate               flag
1     2017-01-01    2017-02-01            flag_1
1     2017-01-09    2017-01-28            flag_1
1     2017-04-01    2017-04-30            flag_2
1     2017-04-05    2017-05-20            flag_2
1     2017-04-20    2017-06-12            flag_2
2     2017-06-02    2017-06-20            flag_1
2     2017-06-14    2017-07-31            flag_1
2     2017-06-14    2017-07-31            flag_1
2     2017-06-19    2017-07-31            flag_1
2     2017-06-19    2017-07-31            flag_1

任何人都可以帮我解释这个逻辑吗?

2 个答案:

答案 0 :(得分:1)

Since this is the original question--I'm posting the answer here. I'd suggest ditching your loops all together. Here's a way with 2 CTE's and ZERO loops.

SELECT
  work_date,
  time_from,
  time_to,
  TIMESTAMPDIFF(HOUR, time_from, time_to) as work_duration,
  (amount * TIMESTAMPDIFF(HOUR, time_from, time_to)) as paid
FROM personal_work
INNER JION work_hour 
ON work_hour.personal_id = personal_work.personal_id
AND work_date BETWEEN valid_date_from and valid_date_to
WHERE work_date BETWEEN '2017-01-01'
  AND '2017-01-31'
  AND personal_id = 3

答案 1 :(得分:0)

以下是我将如何处理它 - 可能存在递归方法,但除非绝对必要,否则我不使用递归。

一些注意事项:我在临时表中完成了工作,以便在开发和测试期间更容易重置,并且我使用整数字段来简化增量逻辑。

var words = Regex.Split(input, pattern);