按 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' 转换为日期或日期时间。
我有一个 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' 转换为日期或日期时间。