使用格式化日期排序,这样做对吗?
Posted
技术标签:
【中文标题】使用格式化日期排序,这样做对吗?【英文标题】:Order by with formatted dates, doing it right? 【发布时间】:2021-03-14 23:15:24 【问题描述】:我只想要一个健全性检查,因为我有一种轻微的感觉,我做错了。我将用例简化为一个非常简单的示例。
格式化日期时,我需要在 order 子句中转换数据以避免对 varchar 对象进行排序。然而。最初,我希望 ORDER 子句与基本的 CONVERT(DATE, OrderDate) 一起工作。但是它会抛出一个明确的异常“列“OrderDate”在 ORDER BY 子句中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。”
如果我完全复制格式,它不会引发此错误。对我来说,首先必须格式化日期,然后再将其转换回来,这完全没有意义。
工作正常,但不得不在 order 子句中格式化感觉很尴尬
SELECT FORMAT (OrderDate,'MMM dd yyyy') AS OrderDate, SUM(Quantity) AS Quantity
FROM ORDERS
GROUP BY FORMAT (OrderDate, 'MMM dd yyyy')
ORDER BY CONVERT(DATE, FORMAT (OrderDate,'MMM dd yyyy')) ASC
没用
SELECT FORMAT (OrderDate,'MMM dd yyyy') AS OrderDate, SUM(Quantity) AS Quantity
FROM ORDERS
GROUP BY FORMAT (OrderDate, 'MMM dd yyyy')
ORDER BY CONVERT(DATE, OrderDate) ASC
我这样做对吗?
【问题讨论】:
老实说,在 RDBMS 中格式化日期是错误的想法;这是表示层要做的事情。担心应用程序中的格式并使用 tic 上的日期来获取日期值。如果OrderDate
是日期和时间数据类型,则只需将其转换为date
。
【参考方案1】:
您可以在ORDER BY
子句中使用聚合函数,因此您无需将字符串转换回日期:
SELECT FORMAT(OrderDate,'MMM dd yyyy') AS OrderDate, SUM(Quantity) AS Quantity
FROM ORDERS
GROUP BY FORMAT(OrderDate, 'MMM dd yyyy')
ORDER BY MIN(OrderDate)
【讨论】:
好的,清楚。我知道我的方法有些不对劲。这有帮助。【参考方案2】:只使用原始列:
ORDER BY MIN(o.OrderDate)
如果没有必要,不要开始将日期转换为字符串并返回日期。
【讨论】:
以上是关于使用格式化日期排序,这样做对吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何将欧洲格式的字符串日期转换为有效的 mysql 日期格式?