我正在尝试编写一个mysql查询,它将一个unix时间戳转换为%Y%m%d格式然后查找某个日期范围之间的行。查询有效,直到我们获得WHERE子句。我不知道为什么它不起作用。我希望这里有一些sql guru可以帮助我。
谢谢,
克里斯
SELECT
date_format(from_unixtime('timestamp'),'%Y%m%d') AS 'datecreated'
,`order_id`
, `email`
, `subtotal`
, `shipping_cost`
, `total`
, `status`
FROM
`orders`
WHERE 'datecreated' >= '20160501' AND 'datecreated' < '20160512'
答案 0 :(得分:2)
您 CANT 使用where
上的别名要么再次编写date_format函数
SELECT
date_format(from_unixtime('timestamp'),'%Y%m%d') AS `datecreated`
,`order_id`
, `email`
, `subtotal`
, `shipping_cost`
, `total`
, `status`
FROM
`orders`
WHERE date_format(from_unixtime('timestamp'),'%Y%m%d') >= '20160501'
AND date_format(from_unixtime('timestamp'),'%Y%m%d') < '20160512'
或创建子查询
SELECT *
FROM (
SELECT
date_format(from_unixtime('timestamp'),'%Y%m%d') AS `datecreated`
,`order_id`
, `email`
, `subtotal`
, `shipping_cost`
, `total`
, `status`
FROM
`orders`
) T
WHERE `datecreated` >= '20160501' AND 'datecreated' < '20160512'
修改强>
也是fieldname使用厚背而不是单引号
`datecreated` field name
'datecreated' string constant
答案 1 :(得分:1)
我正在尝试编写一个mysql查询,它将一个unix时间戳转换为%Y%m%d格式然后查找某个日期范围之间的行。
您可能正在考虑倒退问题。首先通过WHERE找到正确的行,然后担心格式化/转换结果集中的数据:
SELECT date_format(from_unixtime('timestamp'),'%Y%m%d') AS "datecreated",
... other fields ...
FROM "orders"
WHERE "timestamp" >= UNIX_TIMESTAMP('2016-05-01 00:00:00')
AND
"timestamp" < UNIX_TIMESTAMP('2016-05-12 00:00:00')
作为奖励,上述内容可以使用"timestamp"
上的索引。
在默认模式下,MySQL允许多种引用样式并允许字符串为"double quoted"
或'single quoted'
,即使前者是引用标识符的ANSI SQL标准(比如列名。)
虽然这是一种方便,但我认为在这种情况下它比它的价值更麻烦。在您编写'col' > 'yyyymmdd'
的位置,您将一个字符串与另一个字符串进行比较,而不是您要比较的计算列。 (正如评论中所提到的那样,也会失败,但你的查询却没有那么远。)
您可能希望熟悉MySQL的ANSI mode,这消除了很多这种歧义。如果你搬到除MySQL以外的RDBMS,你会很感激。
答案 2 :(得分:0)
更改日期格式
SELECT
date_format(from_unixtime('timestamp'),'%Y%m%d') AS 'datecreated'
,`order_id`
, `email`
, `subtotal`
, `shipping_cost`
, `total`
, `status`
FROM
`orders`
WHERE from_unixtime('timestamp') between '2016-05-01' AND '2016-0512'