Tsql 按顺序使用结果字段

Tsql 按顺序使用结果字段,tsql,stored-procedures,Tsql,Stored Procedures,我将发布一个简单的示例: SELECT " CAST(t.PurchaseDate AS DATE) AS PurchaseDate FROM SomeTable t ORDER BT PurchaseDate 如何确保ORDER BY使用PurchaseDate(仅日期部分),而不使用PurchaseDate表字段 我知道我可以将强制转换结果命名为PurchaseDate2(或其他名称),但我不认为这是一个非常直观的解决方案 SELECT " CAST(t.PurchaseDate AS D

我将发布一个简单的示例:

SELECT " CAST(t.PurchaseDate AS DATE) AS PurchaseDate
FROM SomeTable t
ORDER BT PurchaseDate
如何确保ORDER BY使用PurchaseDate(仅日期部分),而不使用PurchaseDate表字段

我知道我可以将强制转换结果命名为PurchaseDate2(或其他名称),但我不认为这是一个非常直观的解决方案

SELECT " CAST(t.PurchaseDate AS DATE) AS PurchaseDate2
FROM SomeTable t
ORDER BT PurchaseDate2
我还可以再次使用CAST:

ORDER BY CAST(t.PurchaseDate AS DATE)
但我想知道我是否可以避免双重施法

如果结果字段具有相同的名称,我们(以及我们)如何按顺序引用结果字段而不是表字段?

您可以使用下面的
CONVERT()
函数,该函数将只获取日期部分

SELECT CONVERT(date, t.PurchaseDate) AS PurchaseDate
FROM SomeTable t
ORDER BT PurchaseDate
首先,您应该将别名更改为与实际列名不同的名称。类似于
NewPurchaseDate
。不确定为什么要保持它与实际列名相同

其次,您可以执行如下操作,而不是使用
列别名
使用
order by中的实际转换处理

SELECT CONVERT(date, t.PurchaseDate) AS PurchaseDate
FROM SomeTable t
ORDER BY CONVERT(date, t.PurchaseDate)
撇开“”的语法不谈……这不是解决方案,因为order by子句使用表列名,而不是语句别名。如果您正在寻找这种特定的东西:

SELECT " PurchaseDate
FROM (
   SELECT " CAST(t.PurchaseDate AS DATE) AS PurchaseDate
   FROM SomeTable t
) AnotherTable
ORDER BT PurchaseDate

没有PurchaseDate2的丑陋因素

SELECT CAST(t.PurchaseDate AS DATE) AS [Purchase Date]
  FROM SomeTable t
 ORDER BY [Purchase Date]

你能解释一下不使用别名的ORDERBY子句是什么意思吗?我可以在order by子句中使用PurchaseDate2,将PurchaseDate2作为别名?使用SELECT Column1作为fieldN,Column1是列名,fieldN是列别名。SQL中没有其他子句关心列别名(事实上会告诉您它不能绑定),除非您将第一个查询包装到外部查询中,其中内部别名成为外部查询的列名。这不是真的。。。我可以安全地在ORDERBY子句中使用fieldN,它不会抱怨…嗯,我不确定是从哪里学来的,但我刚刚尝试过,你是对的。感谢您消除了一个不正确的视图。除了特定于sql server之外,CAST与CAST有什么不同?您如何确定Order By中的PurchaseDate不是表字段名?@Goran,请参阅编辑后的答案。是的,这没有什么不同,但保持别名与列名相同实际上您混淆了DB引擎,它将按实际列排序,而不是按计算列排序。您编写的解决方案已经由我在问题中编写,我在问是否可以显式指定我们使用的是别名而不是字段名。@Goran,我的回答似乎和你一样,因为我第一次没有正确地阅读你的问题。但正如我在编辑中提到的,明确指定您使用的是列别名,而不是实际列;你需要给一个不同的名字;否则,您认为DB引擎将如何知道它应该使用什么列名称/别名?布拉姆在回答中所说的是同一件事;只是他使用了带空格的列名,并用
[]
对其进行转义。在这种情况下,您甚至可以使用
Purchase\u Date
作为列别名;但无论如何,它必须是不同的。我想,也许有一种方法可以通过前缀指定这是一个别名,比如dbo.PurchaseDate,或者其他什么。这样,引擎就可以知道我们是否要使用别名或字段。如果您阅读了这个问题,我会问,当它们具有相同的名称时,我们(以及我们可以)如何按顺序指定我们是按别名而不是按字段排序的。这似乎是迄今为止最好的主意:)