我的查询工作正常,直到我添加日期范围:
WHERE c.content_date BETWEEN MONTH($date) AND MONTH($today)
基本上我希望从输入日期到今天每月都能获得所有内容。例如,如果$today
为2017-1-23
且$aDate
为2016-11-20
,我希望所有内容从11月到1月(明年)
查询
$result = DB::query("SELECT ".Content::$mDefaultContentListSelect."
FROM crowdhub_content_to_buckets ctb
LEFT JOIN crowdhub_content c
WHERE c.content_date BETWEEN MONTH($date) AND MONTH($today)
ON ctb.crowdhub_content_to_buckets_content = c.content_id
WHERE ctb.crowdhub_content_to_buckets_bucket IN ( SELECT bucket_id FROM crowdhub_buckets b WHERE b.bucket_name IN %ls )
AND ctb.crowdhub_content_to_buckets_content
IN (SELECT content_to_tag_content AS content_id FROM crowdhub_content_to_tags
WHERE content_to_tag_tag IN (SELECT tag_id FROM crowdhub_tags WHERE tag_name IN %ls)) ".$active." ORDER BY ".$sort_string." LIMIT ".($aCount * $aPageId).",".$aCount, $buckets, $tags);
答案 0 :(得分:0)
这应该返回当月的第一天:
DATE_SUB($date, INTERVAL DAYOFMONTH($date)-1 DAY)
这是本月的最后一天:
LAST_DAY($today)
WHERE c.content_date BETWEEN DATE_SUB($date, INTERVAL DAYOFMONTH($date)-1 DAY) AND LAST_DAY($today)
答案 1 :(得分:0)
如果content_date
列的数据类型为 DATE
(我们只是猜测,我们无从得知)...
将DATE
表达式与整数值进行比较时,日期表达式将计算为整数。日期值“2016-12-21”将评估为2000万以北的整数值。准确地说是20,161,221。
该整数值不会小于或等于12.
作为示范:
SELECT MONTH('2016-12-21')
将返回12
的整数值。
因此,删除MONTH
函数。并考虑要与之比较的date
值。并使用评估这些日期值的表达式。
“如果$今天是2017-01-23而$ aDate是2016-11-20我想要所有 内容从11月到1月(明年)“
然后与 date 值进行比较。看起来你想要的东西相当于:
WHERE c.content_date >= '2016-11-01'
AND c.content_date < '2017-02-01'
2016年11月,2016年12月和2017年1月的所有content_date
值均为TRUE(仅限)。
我们可以使用评估这些日期值的表达式。使用问题中给出的日期值,如下所示:
WHERE c.content_date >= DATE_FORMAT( '2016-11-23' ,'%Y-%m-01')
AND c.content_date < DATE_FORMAT( '2017-01-23' + INTERVAL 1 MONTH,'%Y-%m-01')
如果您要在SQL文本中进行变量替换,请注意 date 文字应包含在单引号中。如果没有单引号,破折号将被视为减法运算符
比较
SELECT '2016-12-21'
为:
SELECT 2016-12-21 -- evaluates to integer value 1983