2015-02-05 63 views
0

我需要找出一种方式,无论是在MySQL中还是以编程方式(ColdFusion,但逻辑不是语言特定的)根据每月的日期提取所有用户记录他们每个月都注册一次。根据每月的用户日期选择记录用户注册

例如,2-5-15我想选择所有在任何月份和任何一年的第四个月注册的用户 - 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等

简单的解决方案是在每个月的第一天运行该过程,只是让每个人都从前一个月的时间段,但我想探索每天运行选择以前的日期。

我正在思考这样的事情。如果运行日期是本月的第一天,请确定上个月有多少天。如果是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 
+0

如果需要,这可以纯粹在DB端处理,然后在CF中置入前端。 – 2015-02-05 15:00:44

+0

我更新了今天早上一直在努力的一条思路。 – Steve 2015-02-05 15:01:19

+0

@Steve - 不知道我是否按照这个问题......上述内容似乎描述了*你如何试图接近你的任务,而没有完全定义这个任务是什么。确切地说,你想用简单的英文而不是伪代码来做什么?例如,“在每个月的第一天,我想要检索在前一天”(或之前的X天)注册的用户 - 在任何一年? – Leigh 2015-02-07 19:32:46

回答

0

你可以试试这个: -

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

现在何处是当前日期,也可以提供任何具体日期。

+0

如果我想每个月运行一次该过程,那么这种方法可行。今天运行让我可以从任何一月的所有用户。明天跑步让我有同样的感觉。 – Steve 2015-02-05 15:15:57

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> 

但随着课程的查询参数。

+0

有趣。类似于我上面伪代码,但是不是你的列表,我做了一个循环,最多1-4次迭代,如果它是任何月份的第一次。 – Steve 2015-02-05 15:28:15