我需要从签署之日起计算服务的年度使用量。类似的东西:
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
答案 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 answer和Jon 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 ------
我在此留下这个答案作为参考,但它没有处理闰年,所以不要使用它