【问题标题】:Compare 2 dates with a cte将 2 个日期与 cte 进行比较
【发布时间】:2015-01-28 10:21:48
【问题描述】:

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

我尝试使用 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

【问题讨论】:

  • 当您说它“不起作用”时 - 为什么?您是否收到错误、无结果、错误结果?
  • 我的错误是“将 char 数据类型转换为日期时间数据类型导致日期时间值超出范围”
  • 这里还有别的东西。该 select 语句的行为不会有所不同。这不是真正的代码 - @Tb 没有 OrderID。
  • 是的,我只保留有趣的代码

标签: tsql sql-server-2008-r2


【解决方案1】:

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

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 数据类型。

【讨论】:

  • 对不起,我的单引号不在我的真实要求中,这只是我的例子
  • 是的,但是当我使用临时表时它可以工作,这是我需要了解的 :)
  • 在这种简单的情况下,单个 SELECT、使用 CTE 或使用临时表之间没有区别。我猜是打字错误或类似错误。
  • 我也想,但我用的是复制粘贴。可能是 cte 和 temp 表在解释转换日期时间方面有所不同。
  • 否 - 在这种情况下,单个 SELECT、使用 CTE 或使用临时表之间没有区别。
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多