从时间戳中获得正确的一周和一年

时间:2012-06-01 06:35:24

标签: php sql

我有一个函数可以获取所有新注册的用户,并根据过滤器显示它,无论是按月还是按年新注册。

在这个例子中我使用的是年份,我有这个sql

Select date_registered from users where date_registered > '2011-12-31 12:59:59' AND date_registered < '2013-01-01 12:00:00'

因此,这将导致2012年注册的所有date_registered

问题是如何更具动态性,例如我可以应用过滤器 where date_registered > $dynamic_date and date_registered < $dynamic_date

或任何好的建议如何更好地实现这一点。

谢谢。 。

4 个答案:

答案 0 :(得分:2)

我相信这就是你要找的东西:

$sql = "SELECT date_registered 
       FROM users
       WHERE YEAR(date_registered) = YEAR(NOW())";

检查more information

既然你也想要正确的一周,也要看一下函数YEARWEEK()。它的工作方式相同,并返回周数。 See here

答案 1 :(得分:1)

试试这段代码

$sql = "SELECT date_registered FROM users WHERE date_registered > '$dateStart' AND date_registered < '$dateEnd'";

其中$dateStart$dateEnd是您的动态日期变量

变量周围的一对SINGLE引号应该足够了。如您所见,所有语句字符串必须是双引号。

答案 2 :(得分:1)

如果它是一个小数据集,我会选择Tikkes回答显示的纯SQL路线;但是,出于索引目的,计算边界可能会更好。

mktimedate可用于此:

$lowerBound = date('Y-m-d H:i:s', mktime(0, 0, -1, 1, 1, date('Y')); //1 second before 00:00:00 1 Dec <current year>
$upperBound = date('Y-m-d H:i:s', mktime(0, 0, -1, 1, 1, date('Y') + 1); //1 second before 00:00:00 1 Dec <current year + 1>

那么你就把它们放在一个查询中:

$sql = " ... WHERE d > '$lowerBound' AND d < '$upperBound'";

答案 3 :(得分:1)

你应该使用BETWEEN,它更具可读性。

MySQL有一个很棒的list of date and time functions

基本上,你想要做的是:

SELECT *
FROM Store_Information
WHERE Date BETWEEN '$start' AND '$end'

我不知道您从哪个数据开始,或者您获得$ start和$ end输入的位置。我假设您正在使用从time()生成的unix时间戳,然后您可以执行以下操作:

SELECT *
FROM Store_Information
WHERE Date BETWEEN FROM_UNIXTIME('$start') AND FROM_UNIXTIME('$end')

如果这还不够,请更清楚你如何格式化你的indata($ start,$ end)。