C#:通过固定字符串获取需要的日期(日期替代计算)

解决问题:需要给用户界面,让用户自定义查询的数据,但是数据查询期间的处理比较头痛。

比如需要查询上周1-周7的数据,本月1日到今天的数据。

private string DealFun(string str)
{
	//(YESTERDAY)TODAY.-1.MONDAY.FIRSTDAY.LASTDAY
	//(昨天)今天.-1.星期一.月份第1天.月份最后1天

	int i_funStart, i_funEnd;
	string funStr;
	DateTime dt = DateTime.Today;
	i_funStart = str.IndexOf("[#");
	while (i_funStart >= 0) //处理完所有的函数了
	{
		i_funEnd = str.IndexOf("#]", i_funStart + 2);
		if (i_funEnd == -1)
		{
			return "ERROR";//找不到结束符
		}
		funStr = str.Substring(i_funStart + 2, i_funEnd - i_funStart - 2);
		string[] funs = funStr.Split('.');
		
		for (int i = 0; i < funs.Length; i++)
		{
			if (i == 0)
			{
				switch (funs[i])
				{
					case "TODAY":
						dt = DateTime.Today;
						break;
					case "YESTERDAY":
						dt = DateTime.Today.AddDays(-1);
						break;
					default:
						return "ERROR"; //第一个必须是日期
				}
			}
			else
			{
				if (funs[i].Substring(0, 1) == "-")
				{
					dt = dt.AddDays(Convert.ToInt16(funs[i].Replace("-", "")) * (-1));
				}
				else if (funs[i].Substring(0, 1) == "+")
				{
					dt = dt.AddDays(Convert.ToInt16(funs[i].Replace("-", "")));
				}
				else
				{
					switch (funs[i])
					{
						case "MONDAY":
							//DayOfWeek:  Sunday=0  Monday=1
							int days = Convert.ToInt16(dt.DayOfWeek) == 0 ? 6 : Convert.ToInt16(dt.DayOfWeek) - 1;
							dt = dt.AddDays(days * (-1));
							break;
						case "FIRSTDAY":
							dt = dt.AddDays((-1) * dt.Day + 1);
							break;
						case "LASTDAY":
							dt = dt.AddDays((-1) * dt.Day + 1);//月份第1天
							dt = dt.AddMonths(1).AddDays(-1);//本月最后1天
							break;
						default:
							return "ERROR";
					}
				}
			}
		}

		//将结果替换到字符串中
		str = str.Replace("[#" + funStr + "#]", dt.ToString("yyyy-MM-dd"));

		//查找下一个函数
		i_funStart = str.IndexOf("[#");
	}


	return str;
}
//调用示例:要查询上周1到上周日的数据
sql = "select * from Table1 Where AccountDate between '[#TODAY.-7.MONDAY#]' and '[#TODAY.-7.MONDAY.+6#]'";
textBox1.Text = DealFun(sql);
// 结果:select * from Table1 Where AccountDate between '2018-09-17' and '2018-09-23'


/*  调用说明:
 *  1、字符串里可以有N个函数,每个函数据必须写在"[#" 和 "#]"之内
 *  2、关键字:
 *     YESTERDAY 昨天, TODAY 今天, MONDAY 周一, FIRSTDAY 月份第1天, LASTDAY 月份最后1天
 *  3、开始的关键字必须是YESTERDAY或是TODAY
 *  4、每个关键字间必须用.分隔,如:TODAY.MONDAY,代表:本周1的日期
 *  5、运算符(+ -)的用法:
 *     运算符前必须有. ,如:
 *     TODAY.-7 今天向后倒退7天(上一周的这一天)
 *     TODAY.-7.MONDAY 上周一
 *     TODAY.FIRSTDAY.-1.FIRSTDAY 今天.本月第1天.-1天.月第1天=上个月的第1天
 */

//函数的内容,大家可以参考这个架构继续补充。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值