假设我有一个有效的调度日列表.像:23,27,29
我想根据上面的列表将给定日期修改为下一个有效的日期.
如果您的指定日期是"23/11/2013",则下一个有效日期将是"27/11/2013"但如果您的指定日期是"2013年11月30日",则必须返回"2013年12月23日"如果给定日期是"30/12/2013",则必须返回"23/01/2014"
我已经在SQL中完成了这个,但现在我正在将它转换为C#,这有点棘手.我正在尝试使用LINQ在列表中进行SQL相似性,但它会让人感到困惑.
SQL语句是(是的,我知道它不会很快):
SELECT TOP 1 @DATE = ISNULL(DateAdd(yy, YEAR(@DATE)-1900, DateAdd(m, (MONTH(@DATE)+CASE WHEN DATEPART(day,@DATE)>[DAY] THEN 1 ELSE 0 END) - 1, [DAY] - 1)),@DATE)
FROM @DAYS WHERE DateAdd(yy, YEAR(@DATE)-1900, DateAdd(m, (MONTH(@DATE)+CASE WHEN DATEPART(day,@DATE)>[DAY] THEN 1 ELSE 0 END) - 1, [DAY] - 1))>=@DATE
ORDER BY [DAY]
Run Code Online (Sandbox Code Playgroud)
@DAYS是一张工作台.
我认为你正在寻找的是这样的东西(使用 LINQ):
public static DateTime NextDate(DateTime seed, int[] days)
{
if (Enumerable.Range(1, 31).Intersect(days).Any()) //Check to stop a very long running lookup!
{
return Enumerable.Range(0, int.MaxValue)
.Select(i => seed.AddDays(i))
.First(d => days.Contains(d.Day));
}
return seed;
}
Run Code Online (Sandbox Code Playgroud)
用法:
var nextDate = NextDate(DateTime.Now, new[] { 23, 27, 29 });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |