根据用户注册的月份日期每月选择记录

时间:2015-02-05 14:54:16

标签: mysql coldfusion

我需要在MySQL或编程方式(ColdFusion,但逻辑不是特定于语言)中找出一种方法,以便根据每个月注册的月份来提取所有用户记录。

例如,在2-5-15我想选择在任何月份和任何一年的第4天注册的所有用户 - 1-4-15,12-4-15,1-4-14等。

可能在每个月的第一天出现。所以在3-1,我需要得到2-28的用户,但也需要1-28,1-29,1-30和1-31,同样的12月,11月需要11-28,11- 29,11-30等。

简单的解决方案是在每个月的第一天运行该流程,只是让每个人都从上个月开始,但我想每天选择运行它来选择以前的日期。

[编辑]我正在思考这样的事情。如果运行日期是该月的第1天,则计算出上个月的天数。如果它是31,没问题。如果它是30,我需要从前几个月/年获得全部30和31。如果它是28,那么我需要得到28s,29s,30s和31s。我认为这种逻辑很有用......

[编辑2]这里有一些我觉得有效的伪代码。

set runDate = '2015-03-01'
if day(runDate) = '01'
  set daysLastMonth = days in previous month (28)
  loop from daysLastMonth to 31 index = i
    query all records where day(addDate) = i
  endloop
else
  query all records where day(addDate) = day(runDate)-1
endif

2 个答案:

答案 0 :(得分:2)

Mysql有一个dayofmonth()函数,但使用函数来过滤数据往往很慢。在这种情况下,您最好使用ColdFusion来创建日期列表。像这样:

dayInQuestion = CreateDate(2015,1,1);
dayOfMonthYouWant = Day(DateAdd("d", -1, dayInQuestion));
dateYouWant = CreateDate(2011, 1, dayOfMonthYouWant);
listOfDates = "";
while (dateYouWant < dayInQuestion) {
listOfDates = ListAppend(listOfDates, dateYouWant);
dateYouWant = DateAdd("m", 1, dateYouWant);
}

然后,您的查询将包括:

where yourDateField in (<cfqueryparam cfsqltype="cf_sql_date" 
value="#ListOfDates#" list="yes">)

请注意,这只是一个起点。根据您想要的距离,您可能会遇到列表太长的问题。

实际上,你甚至可能想尝试mysql dayofmonth()。也许它对你的应用来说足够快。

编辑从此处开始

如果您的日期数据包含一天中的时间,您应该考虑另一种方法。

dayInQuestion = CreateDate(2015,1,1);
queryDate = CreateDate(someYear, month(dayInQuestion), day(dayInQuestion);

然后使您的查询类似于:

where 1 = 2
<cfloop condition = "queryDate lt dayInQuestion">
or (
yourDateField >= #dateadd("d", -1, queryDate)#
and yourDateField < #queryDate# )
<cfset queryDate = DateAdd("d", 1, queryDate)>
</cfloop>

但当然还有查询参数。

答案 1 :(得分:0)

你可以试试这个: -

SELECT *
FROM USERS
WHERE MONTH(REG_DATE) = MONTH(NOW()) - 1;

现在可以提供当前日期或任何具体日期。