2013-04-29 1 views
2

После входа в свои учетные записи каждый пользователь имеет дату и время входа в базу данных. Однако то, что я искал, заключается в том, чтобы определить количество дней (или предпочтительно преобразовать в месяцы, если оно превышает месяц), чтобы, если пользователь просматривает свой профиль, он может видеть, насколько активна группа. Кроме того, это могло бы принести мне пользу с точки зрения поддержания активных профилей в верхней части повестки дня для контента на сайте, чтобы он не устарел от неактивного контента пользователей, заполняющего содержимое главной страницы.Расчет дней между последним входом и текущей датой

Я использую ColdFusion, поэтому я бы искал способ найти, например, сколько дней назад #lastLogin# был от #now()#. Скажите, если дата последнего входа была 23/04/2013, а сегодняшняя дата - 29/04/2013, она будет читать «Последняя активность, 1 день назад». Однако, если последний вход был 23/03/2013, он будет читать «Last Active, 1 месяц назад».

Кто-нибудь знает, как это сделать? Благодарю.

P.S В настоящее время у меня нет кода, проверяющего это, поскольку я понятия не имею, с чего начать с точки зрения достижения этого.

+2

DateDiff - ваш друг: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_c-d_28.html Вам понадобится ваша собственная логика, чтобы определить, показывать ли количество месяцев или дни – duncan

+0

Приветствия! Да, у меня неплохая игра, и я вижу, что я могу сделать. – Banny

+0

Вы поняли условную логику того, когда показывать дни и когда показывать месяцы? –

ответ

8

Использование DateDiff

<cfset days = dateDiff("d", LoginDateVariable, now()) /> 

Это так просто.

+0

Если вы просто хотите отобразить это значение, но в противном случае его не следует использовать, вы можете просто сделать ' Последняя активность, #dateDiff (" d ", LoginDateVariable, now()) # дней назад' (в противовес чтобы установить его в переменную, а затем вывести переменную). –

+0

Хорошая идея, но я установил их в переменные, чтобы я мог запускать проверки, чтобы увидеть, если, например, дни больше 31, вместо этого они заменяются на 1 месяц. Затем, как только он достигнет 12 месяцев, он перемещается в годы. – Banny

2

P.S В настоящее время у меня нет кода, проверяющего это, поскольку я понятия не имею, где , чтобы начать с точки зрения достижения этого.

Это не ответит на ваш прямой вопрос, но, чтобы помочь вам узнать, с чего начать, я настоятельно рекомендую рассмотреть встроенные функции ColdFusion и теги, которые доступны вам.

Кроме того, поиск Google обычно приземляйтесь в документах, просто добавляйте «coldfusion» к вашей строке поиска. Поиск google для coldfusion date functions дает очень полезные ответы, первый из которых - список всех ColdFusion date functions.

0

Ответ Дейла - это место на. Но я бы также предложил вернуть его как переменную с вашим запросом. Пусть SQL-сервер выполнит эту работу. Это очень эффективно для тех типов вычислений. Не то, чтобы CF тоже не мог их исправить. Но, вероятно, более подходит SQL для этого подъема. Особенно, если вы уже возвращаете дату lastLogin.

Было бы аналогично решению CF:

SELECT ...., lastLogin, DATEDIFF(d, lastLogin, GETDATE()) AS LastLoginDays 
FROM .... 
WHERE .... 

Это даст вам количество дней. Вам нужно будет решить, как вы хотите определить месяц, если хотите разбить его на месяц/день. Это будет немного сложнее. Вы можете написать функцию SQL, которая может быть запущена в обе даты, и дать вам точное количество дней/месяцев/лет с момента последнего входа.

Еще одна вещь, о которой следует помнить: где создаются даты? Когда вы вставляете loginDate в базу данных, выполняете ли вы теперь() в CF, прежде чем вставляете его или используете getDate() в SQL, когда вы его вставляете? Опять же, я бы дал базе данных логику даты, но вы бы хотели сравнить две даты из того же источника. Например, если ваш loginDate был базой данных getDate(), вы можете не захотеть сравнить это с CF now(). Один идет по дате времени SQL-сервера, а другой - по дате времени CF-сервера. Они могут быть разными.

+1

Я (почтительно) не согласен, потому что гораздо проще/дешевле реплицировать и кластерные веб-серверы, чем реплицировать данные. Старая общепринятая мудрость заключалась в том, что «сервер базы данных является самой мощной машиной, поэтому заставляйте ее делать все». Новая общепринятая мудрость - «позволить вашему серверу базы данных сосредоточиться на хранении/извлечении данных, сделать чип-серверы в любом месте, потому что проще интегрировать другой веб-сервер, чем интегрировать дополнительный сервер базы данных». –

+0

Я бы также добавил, что помещение кода в базу данных, подобную этой, связывает вас с этой базой данных. Наиболее распространенный современный подход заключается в том, чтобы изолировать функции БД, используя инфраструктуру сущности, чтобы ваш код работал в любой базе данных. Если в какой-то момент вам нужно поменять местами на другую базу данных, необходимо изменить драйвер, а не кучу кода sql. –

+0

Я думаю, вы, возможно, неправильно поняли меня, Джероми. Если getDate() или dateDiff() влияют на приложение, тогда возникает большая проблема, чем нужно реплицировать сервер. Пусть db вернет нужные данные. В 99% случаев это то, для чего был создан db. Это просто разъясняет данные, возвращаемые db. Дейл прав в том, что вы не должны привязывать свой код к db. Ваш код приложения не должен заботиться о том, какие данные возвращаются. Использование простых функций SQL для возврата требуемых данных, скорее всего, более эффективно, чем простые SELECT и изменение возвращаемого значения в вашем приложении. – Shawn