C# 中的月历

Posted

技术标签:

【中文标题】C# 中的月历【英文标题】:MonthCalendar in C# 【发布时间】:2012-04-20 10:37:08 【问题描述】:

我有一个数据库,我使用 SQL 查询从中获取数据到我的 C# 应用程序。

我的应用中有一个选项可以获取从 MonthCalendar 中选择的当天数据:

"between '" + monthCalendar1.SelectionStart.Month.ToString() + "' and '" + monthCalendar1.SelectionStart.AddDays(1).ToString()+

所以当我从日历表单中选择 2012-03-06 时,我的 sql 查询会得到类似的结果:

between '2012-03-06' and '2012-03-12'

它正在工作。

现在我想获取整个月的数据 - 如何修改部分 sql 查询,所以当我选择 4 月的某一天时,我得到了这个:

between '2012-04-01' and '2012-04-30'

?

编辑: 我取得了一些进展 - 我有一个月的第一天,但​​如何才能获得最后一天?

monthCalendar1.SelectionStart.Year.ToString()+"-"+monthCalendar1.SelectionStart.Month.ToString().PadLeft(2,'0')+"-"+"01"

【问题讨论】:

请使用参数化的sql字符串。 请同时编辑您的标签 - 您的问题与 MonthCalendar 无关,而是关于日期/时间算术和 SQL。 【参考方案1】:

永远不要将您的 SQL 语句作为字符串放在一起! Remember Bobby表...

除此之外:

DateTime someDay = ...;
DateTime firstOfMonth = new DateTime(someDay.Year, someDay.Month, 1);
DateTime lastOfMonth = firstOfMonth.AddMonths(1).AddDays(-1);

string sqlString = "SELECT ... FROM ... WHERE ... AND ... BETWEEN @d1 AND @d2";
using (SqlCommand cmd = new SqlCommand(sqlString, connection))

    cmd.Parameters.AddWithValue("@d1", firstOfMonth);
    cmd.Parameters.AddWithValue("@d2", lastOfMonth);
    ...

编辑 想一想:您实际上会注意到,您想要的内容不会返回介于lastOfMonth 00:00:01lastOfMonth 23:59:59 之间的任何条目。实际上,您应该从所选月份的第一天到下个月的第一天查询以获得所需的信息(减去一毫秒而不是一天将没有帮助,因为 SQL Server 无法准确存储毫秒)。

【讨论】:

【参考方案2】:
DateTime startDate = new DateTime(dt.Year, dt.Month, 1);
DateTime enddate = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month));


between '" + startDate.ToString("yyyy-MM-dd") + "' and '" + enddate.ToString("yyyy-MM-dd")+

使用它来获取所选月份的最后一天

DateTime.DaysInMonth(dt.Year, dt.Month);

http://social.msdn.microsoft.com/Forums/en/Vsexpressvcs/thread/218260ec-b610-4fa6-9d1b-f56f3438b721

【讨论】:

您能修改您的样品吗?在德国不适合我。或者您可能只使用参数化查询... 我实际上是在你甚至在宣传这种“用于 SQL 查询的连接字符串”的废话之后...... 问题是如何获得整个月的时间跨度,他如何获得第一天和最后一天。不是SQL查询问题 我知道 - 但我认为每个开发人员都有责任告诉其他人在看到 SQL 注入时阻止他们。我没有说您的日期/时间计算错误,但是当您说问题只是关于获得一个月的时间跨度时,为什么要在回复中插入 SQL 代码? 如果你能读懂这个问题,这种类型的陈述也包含在问题中,他说它有效【参考方案3】:
    DateTime startDate = DateTime.Parse("03.04.2012");

    DateTime firstofMonth = new DateTime(startDate.Year, startDate.Month, 1);

    DateTime endOfMonth = firstofMonth.AddMonths(1).AddDays(-1);

【讨论】:

但是当我选择 2012-03-20 时,它会增加一个月和 1 天。

以上是关于C# 中的月历的主要内容,如果未能解决你的问题,请参考以下文章

c#实现输出本月的月历

如何突出显示月历控件中的日期?

如何使用c#从其他形式的菜单项中显示月历上的当前日期

在C#的月历控件中,怎样得到被选中的日期?

当维度大于 1,1 时,指定月历中的第一个月

当项目与数据库中的值不相等时如何取回列表的数据源