我必须每次检查最短日期并添加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
任何人都可以帮我解释这个逻辑吗?
答案 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);