从签署之日起计算服务的年度使用情况

时间:2015-02-12 16:45:53

标签: c# mysql date datetime

我需要从签署之日起计算服务的年度使用量。类似的东西:

select Count(*) from TABLENAME where Date >= MYDATE

MYDATE需要从订阅日期开始计算,我需要从订阅中获取指向当前日期的最后一年日期

一些例子:

  

订阅日期:2007-06-29

     

如果当前日期为:2015-04-29则日期为:2014-06-29

     

如果当前日期为:2015-06-29则日期为:2015-06-29

     

如果当前日期为:2015-06-29则日期为:2015-06-29

我使用c#来计算日期,但它在leapyear中崩溃了:

var date = new DateTime(DateTime.Now.Year, subscriptionDate.Month, subscriptionDate.Day);
if (DateTime.Now.Date < date)
{
    date = date.AddYears(-1);
}

我想知道是否有一个聪明/更好的方法在c#或mysql中处理leapyear

--- ---- UPDATE

Running example with suggested solutions

3 个答案:

答案 0 :(得分:3)

好吧,我自己在Noda Time做了这件事:

LocalDate subscriptionDate = ...;
LocalDate today = ...; // Need to take time zone into account
int years = Period.Between(subscriptionDate, today);
return subscription.PlusYears(years);

使用.NET会稍微困难一些,但我仍然会选择添加年份的方法(并让它在2月29日进行截断):

// Only call this *once* - otherwise you could get inconsistent results
DateTime today = DateTime.Today;
int years = today.Year - subscriptionDate.Year;
DateTime candidate = subscriptionDate.AddYears(years);
// We might have overshot, in which case lower the number of years.
return candidate <= today ? candidate : subscriptionDate.AddYears(years - 1);

答案 1 :(得分:0)

使用mysql DATE_SUB函数

DATE_SUB(Date, INTERVAL 1 YEAR)

答案 2 :(得分:0)

感谢Yuri Dorokhov answerJon Skeet suggestion

我找到了一个运行良好且处理闰年的解决方案:

int year = DateTime.Now.DayOfYear >= subscriptionDate.DayOfYear ? 
             DateTime.Now.Year : DateTime.Now.Year - 1;
var date = new DateTime(year, 1, 1).AddDays(subscriptionDate.DayOfYear - 1);

-------- UPDATE ------

我在此留下这个答案作为参考,但它没有处理闰年,所以不要使用它