我有什么:
情景1:
SELECT `agent_id`, COUNT(`id`) AS total_users
FROM `users`
WHERE FROM_UNIXTIME(`create_at`, '%m-%d-%Y') <= '01-01-2016'
GROUP BY `agent_id`
结果:
agent_id | total_users
------------------------
foo | 0
bar | 0
情景2:
SELECT `agent_id`, COUNT(`id`) AS total_users
FROM `users`
WHERE FROM_UNIXTIME(`create_at`, '%m-%d-%Y') <= '12-31-2015'
GROUP BY `agent_id`
结果:
agent_id | total_users
------------------------
foo | 532
bar | 435
问题
日期total_users
的{{1}}列始终为0.但是当我将值从01-01-2016
更改为01-01-2016
时,值会有所不同,它会返回许多用户。看起来当年份发生变化时,数据会混乱。
答案 0 :(得分:0)
在你的例子中:
FROM_UNIXTIME(`create_at`, '%m-%d-%Y') <= '01-01-2016'
它不是DATE,而是字符串。这就是01...
给出0而12...
给出很多行的原因。因为12
大于01
字符串。
因此,为了使其正确,您可以将两者都转换为DATE格式:
SELECT `agent_id`, COUNT(`id`) AS total_users
FROM `users`
WHERE FROM_UNIXTIME(`create_at`) <= STR_TO_DATE('01-01-2016','%m-%d-%Y');
GROUP BY `agent_id`
答案 1 :(得分:0)
除非您在与其他日期进行比较时将STR_TO_DATE
用于日期字符串,否则它将被视为字符串比较。
请尝试以下查询:
SELECT `agent_id`, COUNT(`id`) AS total_users
FROM `users`
WHERE FROM_UNIXTIME(`create_at`, '%m-%d-%Y') <= STR_TO_DATE('01-01-2016','%m-%d-%Y')
GROUP BY `agent_id`;
检查一下:
SELECT '01-01-2016' > '12-31-2015';
结果: 0
i.e.
FALSE
。 [因为它的字符串比较不是日期比较。]
现在看看:
SELECT STR_TO_DATE('01-01-2016','%m-%d-%Y') > STR_TO_DATE('12-31-2015','%m-%d-%Y')
结果: 1
i.e.
TRUE
。[因为它现在是日期比较。]
答案 2 :(得分:0)
这是解决方案,将比较日期转换为unix时间戳,并使用create_at
进行检查SELECT `agent_id`, COUNT(`id`) AS total_users
FROM `users`
WHERE `create_at` <= UNIX_TIMESTAMP('01-01-2016')
GROUP BY `agent_id`
和
SELECT `agent_id`, COUNT(`id`) AS total_users
FROM `users`
WHERE FROM_UNIXTIME(`create_at`, '%m-%d-%Y') <= STR_TO_DATE('01-01-2016','%m-%d-%Y')
GROUP BY `agent_id`;
在第二个查询中有两个函数调用FROM_UNIXTIME()
和STR_TO_DATE()
但在第一个查询中只有一个函数调用UNIX_TIMESTAMP()
。哪种解决方案适合您可以使用
希望这对你有用
答案 3 :(得分:0)
上面的答案没有用。
我不知道为什么,但是,这个解决方案似乎有效:
而不是使用
WHERE FROM_UNIXTIME(create_at, '%m-%d-%Y') <= '01-01-2016'
我刚刚省略了函数的第二个参数,并将日期重新格式化为Y-m-d
所以我的where子句现在看起来像这样
WHERE FROM_UNIXTIME(create_at) <= '2016-01-01'
奇怪的是它奏效了。无论如何,感谢那些试图帮助我的人。