按 SQL Server 2012 中字符串类型的日期排序

Sorting by Date of type String in SQL Server 2012

我有一个 SQL 查询,我在其中使用 JOINS 检索一些数据,该查询也有一个 DateTime 字段 Delivery,但在检索时我将其转换为格式为 MMM YYYY 的字符串,但最后我想按 Delivery 对整个列表进行排序,但是当我将该列转换为字符串时,我不确定如何按原始 [=] 对结果进行排序13=] 字段 Delivery。我的查询如下

WITH deliveryProducts AS
(
  SELECT DISTINCT FORMAT(a.Delivery,'MMMM yyyy') AS Delivery, b.Product 
  FROM DEALS as a, PRODUCTS as b Where a.TradeDate<=@tradeEndDate
)
, deliveryActuals AS
(
  SELECT
          FORMAT(a.Delivery,'MMMM yyyy') AS Delivery,

          b.Product,COUNT(a.Id) AS Trades, 
          ((6.2898*SUM(a.Volume ))/DAY(EOMONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery), 0))))*0.001 AS BBLperDay,
          SUM(a.Volume) AS M3,

         SUM(a.Volume*a.Price)/Sum(a.Volume) AS WeightedAverage
FROM     Deals AS a right outer join Products AS b 
           ON a.Product=b.Product AND
           a.TradeDate<=@tradeEndDate
GROUP BY  b.Product,

          DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery),0),  FORMAT(a.Delivery,'MMMM yyyy')

  )

SELECT
  dp.Delivery, dp.Product, trades, BBLperDay, M3, WeightedAverage
FROM
  deliveryProducts dp

  LEFT JOIN deliveryActuals da
    on dp.Delivery = da.Delivery
    and dp.product = da.Product

ORDER BY dp.Delivery,dp.Product

上面的查询给了我所需的数据,但按 Delivery 排序为 string

我可以知道更好的解决方法吗?

您可以将月份和年份作为整数分组,然后在末尾格式化日期:

WITH deliveryProducts AS
(
  SELECT    MONTH(a.Delivery) AS DeliveryMonth, 
            YEAR(a.Delivery) AS DeliveryYear,
            b.Product 
  FROM DEALS as a, PRODUCTS as b 
  WHERE a.TradeDate <= @tradeEndDate
)
, deliveryActuals AS
(
  SELECT  MONTH(a.Delivery) AS DeliveryMonth, 
          YEAR(a.Delivery) AS DeliveryYear,
          b.Product,COUNT(a.Id) AS Trades, 
          ((6.2898*SUM(a.Volume ))/DAY(EOMONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery), 0))))*0.001 AS BBLperDay,
          SUM(a.Volume) AS M3,

         SUM(a.Volume*a.Price)/Sum(a.Volume) AS WeightedAverage
FROM     Deals AS a right outer join Products AS b 
           ON a.Product=b.Product AND
           a.TradeDate<=@tradeEndDate
GROUP BY  b.Product,
          MONTH(a.Delivery), 
          YEAR(a.Delivery)

  )

SELECT
  FORMAT(
      CAST(CAST(dp.DeliveryYear AS VARCHAR(4)) +
  RIGHT('0' + CAST(dp.DeliveryMonth AS VARCHAR(2)), 2) +
  RIGHT('0' + CAST(1 AS VARCHAR(2)), 2) 
AS DATETIME), 'MMMM yyyy'),
  dp.Product, trades, BBLperDay, M3, WeightedAverage
FROM
  deliveryProducts dp

  LEFT JOIN deliveryActuals da
    on dp.DeliveryMonth = da.DeliveryMonth
    and dp.DeliveryYear = da.DeliveryYear
    and dp.product = da.Product

ORDER BY dp.DeliveryYear, dp.DeliveryYear, dp.Product
ORDER BY cast(dp.Delivery as date), dp.Product

SQL 服务器可以自行处理将字符串 'MMMM yyyy' 或 'MMM yyyy' 转换为日期或日期时间。