2015-02-05 62 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