日期分割,做按時間統計時會用到
我們知道數據庫裏的datediff函數可以判斷兩個時間的時間差,在做統計時,常常會統計:今天的記錄,本周的記錄,本月的記錄,三個月內的記錄,本年度記錄等等。
用datediff函數時的寫法大致如下:
case "datetimespan":
switch (keyword.ToLower())
{
case "all":
break;
case "today":
filter = filter + "AND datediff(day,chattime,getdate())=0";
break;
case "week":
filter = filter + "AND datediff(week,chattime,getdate())=0";
break;
case "month":
filter = filter + "AND datediff(month,chattime,getdate())=0";
break;
case "threemonth":
filter = filter + "AND datediff(month,chattime,getdate())<=2";
break;
}
break;
如果想對時間段做的更為人性化或更精確,還是自己拆分時間段比較好。比如統計時間到當前時間。
using System;
using System.Collections.Generic;
using System.Globalization;
namespace 日期分割
{
class Program
{
static void Main()
{
Dictionary<string, string> timeRangeDic = new Dictionary<string, string>();
Console.WriteLine("==================[一天內時間段(到當前時間)分割]====================");
DateTime todayStart = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
for (int hour = 1; hour <= DateTime.Now.Hour; hour++)
{
string key = string.Format("{0}-{1}", todayStart.AddHours(hour - 1).ToString("HH時"),
todayStart.AddHours(hour).ToString("HH時"));
if (!timeRangeDic.ContainsKey(key))
{
timeRangeDic.Add(key,
todayStart.AddHours(hour - 1).ToString("yyyy-MM-dd HH:00:00") + " 到 " +
todayStart.AddHours(hour).ToString("yyyy-MM-dd HH:00:00"));
}
}
foreach (KeyValuePair<string, string> pair in timeRangeDic)
{
Console.WriteLine(pair.Key + " " + pair.Value);
}
Console.WriteLine();
Console.WriteLine("==================[最近一周內(到當前時間)時間段分割]================");
timeRangeDic.Clear();
DateTime weekStart =
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")).AddDays(-(int)(DateTime.Now.DayOfWeek));
for (int day = 0; day < Convert.ToInt32(DateTime.Now.DayOfWeek); day++)
{
string key = string.Format("{0}-{1}", GetWeek(day), GetWeek(day + 1));
if (!timeRangeDic.ContainsKey(key))
{
if (day == Convert.ToInt32(DateTime.Now.DayOfWeek) - 1)
{
timeRangeDic.Add(key,
weekStart.AddDays(day).ToString("yyyy-MM-dd HH:00:00") + " 到 " +
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));//當前時間
}
else
{
timeRangeDic.Add(key,
weekStart.AddDays(day).ToString("yyyy-MM-dd HH:00:00") + " 到 " +
weekStart.AddDays(day + 1).ToString("yyyy-MM-dd HH:00:00"));
}
}
}
foreach (KeyValuePair<string, string> pair in timeRangeDic)
{
Console.WriteLine(pair.Key + " " + pair.Value);
}
Console.WriteLine();
Console.WriteLine("==================[最近一月內(到當前時間)時間段分割]==============");
timeRangeDic.Clear();
DateTime monthStart = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01 00:00:00"));
for (int day = 1; day < DateTime.Now.Date.Day; day++)
{
string key = string.Format("{0}日-{1}日", day.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0'),
(day + 1).ToString(CultureInfo.InvariantCulture).PadLeft(2, '0'));
if (!timeRangeDic.ContainsKey(key))
{
if (day == DateTime.Now.Date.Day - 1)
{
timeRangeDic.Add(key,
monthStart.AddDays(day - 1).ToString("yyyy-MM-dd HH:00:00") + " 到 " +
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
timeRangeDic.Add(key,
monthStart.AddDays(day - 1).ToString("yyyy-MM-dd HH:00:00") + " 到 " +
monthStart.AddDays(day).ToString("yyyy-MM-dd HH:00:00"));
}
}
}
foreach (KeyValuePair<string, string> pair in timeRangeDic)
{
Console.WriteLine(pair.Key + " " + pair.Value);
}
Console.WriteLine();
Console.WriteLine("==================[最近三個月內(到當前時間)時間段分割]==============");
timeRangeDic.Clear();
DateTime currMonthStart = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01 00:00:00"));
for (int month = 2; month >= 0; month--)
{
string key = string.Format("{0}-{1}",
currMonthStart.AddMonths(-month - 1).ToString("yyyy年MM月"),
currMonthStart.AddMonths(-month).ToString("yyyy年MM月"));
if (!timeRangeDic.ContainsKey(key))
{
if (month == 0)
{
timeRangeDic.Add(key,
currMonthStart.AddMonths(-month - 1)
.ToString("yyyy-MM-dd HH:00:00") +
" 到 " +
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));//當前時間
}
else
{
timeRangeDic.Add(key,
currMonthStart.AddMonths(-month - 1)
.ToString("yyyy-MM-dd HH:00:00") +
" 到 " +
currMonthStart.AddMonths(-month).ToString("yyyy-MM-dd HH:00:00"));
}
}
}
foreach (KeyValuePair<string, string> pair in timeRangeDic)
{
Console.WriteLine(pair.Key + " " + pair.Value);
}
Console.WriteLine();
Console.WriteLine("==================[本年內(到當前時間)時間段分割]===================");
timeRangeDic.Clear();
DateTime yearStart = DateTime.Parse(DateTime.Now.ToString("yyyy-01-01 00:00:00"));
for (int month = 1; month < DateTime.Now.Date.Month; month++)
{
string key = string.Format("{0}月-{1}月",
month.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0'),
(month + 1).ToString(CultureInfo.InvariantCulture).PadLeft(2, '0'));
if (!timeRangeDic.ContainsKey(key))
{
if (month == DateTime.Now.Date.Month - 1)
{
timeRangeDic.Add(key,
yearStart.AddMonths(month - 1).ToString("yyyy-MM-dd HH:00:00") +
" 到 " +
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
timeRangeDic.Add(key,
yearStart.AddMonths(month - 1).ToString("yyyy-MM-dd HH:00:00") +
" 到 " +
yearStart.AddMonths(month).ToString("yyyy-MM-dd HH:00:00"));
}
}
}
foreach (KeyValuePair<string, string> pair in timeRangeDic)
{
Console.WriteLine(pair.Key + " " + pair.Value);
}
Console.Read();
}
public static string GetWeek(int current)
{
string[] weekdays = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
string week = current < weekdays.Length ? weekdays[current] : "";
return week;
}
}
}
輸出結果:

最後更新:2017-04-02 22:14:28