年度变化时重置结果

时间:2016-03-14 04:54:25

标签: mysql

我有什么:

情景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时,值会有所不同,它会返回许多用户。看起来当年份发生变化时,数据会混乱。

4 个答案:

答案 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'

奇怪的是它奏效了。无论如何,感谢那些试图帮助我的人。