Tsql 用cte比较两个日期

Tsql 用cte比较两个日期,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我需要比较两个日期,我有一个datetime和一个varchar。 为此,我将varchar转换为datetime,并将其插入到临时表中 我尝试了一个cte,但它没有工作,同样的结果与一个简单的选择 为什么我的请求使用临时表而不是cte 使用表格: DECLARE @Tb TABLE ( DateCreation DATETIME, DateAchat DATETIME ) insert into @Tb SELECT Convert(datetime, DateCreatio

我需要比较两个日期,我有一个datetime和一个varchar。 为此,我将varchar转换为datetime,并将其插入到临时表中

我尝试了一个cte,但它没有工作,同样的结果与一个简单的选择

为什么我的请求使用临时表而不是cte

使用表格:

DECLARE @Tb TABLE 
( 
  DateCreation DATETIME,
  DateAchat DATETIME
)

insert into @Tb
SELECT
  Convert(datetime, DateCreation, 120), -- varchar
  Convert(datetime, DateAchat, 103), -- datetime
FROM MyTable


SELECT DISTINCT * FROM @Tb WHERE DateAchat > DateCreation ORDER BY OrderId ASC
使用CTE:

WITH cte ( DateCreation, DateAchat )
AS (
  SELECT
    Convert(datetime, DateCreation, 120), -- varchar
    Convert(datetime, DateAchat, 103), -- datetime
  FROM MyTable
)

SELECT DISTINCT * FROM cte WHERE DateAchat > DateCreationenter code here

CONVERT表达式中的列名周围有单引号-如果引用的是列,则这是不对的。对于已经是DATETIME的值,也不需要转换

WITH cte ( DateCreation, DateAchat )
AS (
  SELECT
    Convert(datetime, DateCreation, 120), -- varchar
    Convert(datetime, DateAchat, 103) -- datetime
  FROM MyTable
)

SELECT DISTINCT * FROM cte WHERE DateAchat > DateCreation

DATETIME数据类型的范围是1753年1月1日到9999年12月31日。如果您需要更大的范围或更精确的时间,那么您可以使用DATETIME2数据类型。

对不起,我的单引号不在我的实际请求中,这只是我的示例是的,但当我使用临时表时,它是有效的,我需要理解:)在这种简单的情况下,使用CTE的单次选择之间没有区别,或者使用临时表。我猜可能是打字错误或类似的错误。我也这么认为,但我使用了复制粘贴。可能是cte和temp表格在解释转换日期时间方面有差异。否-在这种情况下,单个选择、使用cte或使用temp表格之间没有区别。当您说它“不工作”时,为什么?您是否收到错误、无结果、错误的结果?我的错误是“将字符数据类型转换为日期时间数据类型导致日期时间值超出范围”。这里还有其他问题。select语句的行为不会有所不同。这不是真正的代码-@Tb没有OrderID。是的,我只是保留了有趣的代码