基本單日運算
// 今天
string today = DateTime.Now.ToString("yyyy-MM-dd");
// 昨天
string yesterday = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");
// 明天
string tomorrow = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
週區間 (週日~週六)
// 取得今天是星期幾 (0=週日, 6=週六)
int dayOfWeek = (int)DateTime.Now.DayOfWeek;
// 本週起訖
string weekStart = DateTime.Now.AddDays(-dayOfWeek).ToString("yyyy-MM-dd"); // 週日
string weekEnd = DateTime.Now.AddDays(6 - dayOfWeek).ToString("yyyy-MM-dd"); // 週六
// 上週
string lastWeekStart = DateTime.Now.AddDays(-dayOfWeek - 7).ToString("yyyy-MM-dd");
string lastWeekEnd = DateTime.Now.AddDays(6 - dayOfWeek - 7).ToString("yyyy-MM-dd");
// 下週
string nextWeekStart = DateTime.Now.AddDays(-dayOfWeek + 7).ToString("yyyy-MM-dd");
string nextWeekEnd = DateTime.Now.AddDays(6 - dayOfWeek + 7).ToString("yyyy-MM-dd");
月區間
// 本月首尾日 (推薦用格式化字串,簡潔不易錯)
string monthStart = DateTime.Now.ToString("yyyy-MM-01");
string monthEnd = DateTime.Parse(monthStart).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
// 上月
string lastMonthStart = DateTime.Parse(monthStart).AddMonths(-1).ToString("yyyy-MM-dd");
string lastMonthEnd = DateTime.Parse(monthStart).AddDays(-1).ToString("yyyy-MM-dd");
// 下月
string nextMonthStart = DateTime.Parse(monthStart).AddMonths(1).ToString("yyyy-MM-dd");
string nextMonthEnd = DateTime.Parse(monthStart).AddMonths(2).AddDays(-1).ToString("yyyy-MM-dd");
年區間
// 本年度
string yearStart = DateTime.Now.ToString("yyyy-01-01");
string yearEnd = DateTime.Parse(yearStart).AddYears(1).AddDays(-1).ToString("yyyy-MM-dd");
// 上年度
string lastYearStart = DateTime.Parse(yearStart).AddYears(-1).ToString("yyyy-MM-dd");
string lastYearEnd = DateTime.Parse(yearStart).AddDays(-1).ToString("yyyy-MM-dd");
// 下年度
string nextYearStart = DateTime.Parse(yearStart).AddYears(1).ToString("yyyy-MM-dd");
string nextYearEnd = DateTime.Parse(yearStart).AddYears(2).AddDays(-1).ToString("yyyy-MM-dd");
季度區間 (關鍵技巧:利用模運算對齊季首月)
// 目前月份 (1-12)
int m = DateTime.Now.Month;
// 本季度第一個月 (1,4,7,10)
int quarterStartMonth = m - (m - 1) % 3;
string quarterStart = new DateTime(DateTime.Now.Year, quarterStartMonth, 1).ToString("yyyy-MM-dd");
// 本季度最後一天 = 下季度第一天 - 1 天
string quarterEnd = new DateTime(DateTime.Now.Year, quarterStartMonth + 3, 1).AddDays(-1).ToString("yyyy-MM-dd");
// 上季度
string lastQuarterStart = new DateTime(DateTime.Now.Year, quarterStartMonth - 3, 1).ToString("yyyy-MM-dd");
string lastQuarterEnd = new DateTime(DateTime.Now.Year, quarterStartMonth, 1).AddDays(-1).ToString("yyyy-MM-dd");
// 下季度
string nextQuarterStart = new DateTime(DateTime.Now.Year, quarterStartMonth + 3, 1).ToString("yyyy-MM-dd");
string nextQuarterEnd = new DateTime(DateTime.Now.Year, quarterStartMonth + 6, 1).AddDays(-1).ToString("yyyy-MM-dd");
相對天數區間
// 近 7 天 (含今天)
string last7Start = DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd");
string last7End = DateTime.Now.ToString("yyyy-MM-dd");
// 近 30 天
string last30Start = DateTime.Now.AddDays(-30).ToString("yyyy-MM-dd");
string last30End = DateTime.Now.ToString("yyyy-MM-dd");
中文星期顯示
string[] weekNames = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string todayChi = weekNames[(int)DateTime.Now.DayOfWeek];
封裝成通用工具類別
public static class DateRangeHelper {
public static (DateTime Start, DateTime End) GetWeekRange(DateTime? baseDate = null) {
DateTime d = baseDate ?? DateTime.Today;
int dow = (int)d.DayOfWeek;
return (d.AddDays(-dow), d.AddDays(6 - dow));
}
public static (DateTime Start, DateTime End) GetMonthRange(DateTime? baseDate = null) {
DateTime d = baseDate ?? DateTime.Today;
DateTime start = new DateTime(d.Year, d.Month, 1);
return (start, start.AddMonths(1).AddDays(-1));
}
public static (DateTime Start, DateTime End) GetQuarterRange(DateTime? baseDate = null) {
DateTime d = baseDate ?? DateTime.Today;
int qStartMonth = d.Month - (d.Month - 1) % 3;
DateTime start = new DateTime(d.Year, qStartMonth, 1);
return (start, start.AddMonths(3).AddDays(-1));
}
public static (DateTime Start, DateTime End) GetYearRange(DateTime? baseDate = null) {
DateTime d = baseDate ?? DateTime.Today;
DateTime start = new DateTime(d.Year, 1, 1);
return (start, start.AddYears(1).AddDays(-1));
}
}
使用範例
var (qStart, qEnd) = DateRangeHelper.GetQuarterRange();
string sql = $"SELECT * FROM Sales WHERE OrderDate BETWEEN '{qStart:yyyy-MM-dd}' AND '{qEnd:yyyy-MM-dd}'";