日期分割,做按时间统计时会用到

简介:

 我们知道数据库里的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;
        }
    }
}
输出结果:


目录
相关文章
|
机器学习/深度学习 搜索推荐 数据挖掘
24个终极数据科学项目(可免费获取资源)
本文精选了24个数据科学项目,并囊括了各个领域和各种不同大小的数据集。另外,所有的数据集都是开源、可免费获取的。
6946 0
|
缓存 算法 Python
概率图推断之信念传播
变量消除算法有个致命的缺陷:每次查询都要要从头开始重新启动算法。这样会非常浪费资源,并且在计算上很麻烦。 这个问题也很容易避免。通过在第一次运行变量消除算法后缓存这些因子,我们可以轻松地计算新的边缘概率查询,基本上不需要额外的成本。 实现上面的功能有2中算法:信念传播(BP)和全联结树算法,本文先介绍信念传播算法。
357 0
概率图推断之信念传播
[启动流程] RT-Thread是如何启动的?
[启动流程] RT-Thread是如何启动的?
|
运维 安全 网络安全
怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
阿里云CDN经过10多年的技术沉淀和实践,已经从传统的加速,逐渐构筑起一个边缘+云的安全网络立体防护体系,从全链路安全传输、常见攻击类型的边缘防御、企业级独享资源部署、运维以及内容安全保障机制几个维度,为企业通向网络提供安全可靠的桥梁。
2626 0
怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
|
运维 Prometheus 监控
双11 背后的全链路可观测性:阿里巴巴鹰眼在“云原生时代”的全面升级
作为一支深耕多年链路追踪技术 (Tracing) 与性能管理服务 (APM) 的团队,阿里巴巴中间件鹰眼团队的工程师们见证了阿里巴巴基础架构的多次升级,每一次的架构升级都会对系统可观测性能力 (Observability) 带来巨大挑战,而这次的“云原生”升级,给我们带来的新挑战又是什么呢?
双11 背后的全链路可观测性:阿里巴巴鹰眼在“云原生时代”的全面升级
|
应用服务中间件 nginx
nginx反向代理配置去除前缀
nginx反向代理配置去除前缀使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法: 方法一:加"/"server { listen 8000; server_name abc.
3286 0
|
算法 Linux 数据安全/隐私保护
Linux 生成CRT、KEY、CSR证书
今天在配置kibana权限设置时,kibana要求使用https链接。 于是总结了一下linux下openssl生成 签名的步骤: x509证书一般会用到三类文,key,csr,crt。
4416 0