【问题标题】:Conversion failed when converting datetime from character string in where clause从 where 子句中的字符串转换日期时间时转换失败
【发布时间】:2016-05-03 00:39:40
【问题描述】:

我正在尝试使用以下 SQL 语句,但一旦触发查询,我就会收到 '从字符串转换日期时间时转换失败。' 错误消息。

我尝试将 where 子句中的会计期和日期转换为有效的日期时间,但是一旦我使用过滤器进行日期时间查询,就会失败。

如果我将相同的结果存储在临时表中,然后在临时表上使用日期过滤器,那么我会得到预期的结果。

你能检查一下下面的查询有什么问题吗?

WITH TEMP_LEDGERPERIOD ( DATAAREAID, PERIODSTART, PERIODEND, FISCALPERIOD )
AS 
(
    SELECT dataareaid, PERIODSTART, PERIODEND, CONVERT(DATETIME, '01-' + COMMENTARIES) AS FiscalPeriod
    FROM LEDGERPERIOD LPT WITH (NOLOCK)
    WHERE (COMMENTARIES NOT LIKE '%OPEN' and COMMENTARIES NOT LIKE '%CLOSE')
)

Select * 
from TEMP_LEDGERPERIOD
where FiscalPeriod BETWEEN '2016/01/01' AND '2016/02/01'

【问题讨论】:

  • commentaries 长什么样子?
  • WHERE 子句或 CONVERT 函数是否有错误?注释掉 WHERE 子句,看看你是否仍然得到错误。

标签: sql sql-server


【解决方案1】:

使用日期时,您应该使用 ISO 标准日期格式或明确说明转换。我不知道COMMENTARIES 长什么样子,但是日期开头的“01-”似乎不太可能。

此外,SQL Server 不保证表达式的计算顺序,除非您使用CASE。因此,WHERE 子句中的过滤可能发生在计算新值之后。幸运的是,SQL Server 2012+ 提供了TRY_CONVERT()

如果我假设COMMENTARIES 的格式是“YYYY-MM”,那么你可以选择:

WITH TEMP_LEDGERPERIOD ( DATAAREAID, PERIODSTART, PERIODEND, FISCALPERIOD ) AS (
      SELECT dataareaid, PERIODSTART, PERIODEND,
             TRY_CONVERT(DATETIME, COMMENTARIES + '-01') AS FiscalPeriod
      FROM LEDGERPERIOD LPT WITH (NOLOCK)
      WHERE COMMENTARIES NOT LIKE '%OPEN' and COMMENTARIES NOT LIKE '%CLOSE'
     )
Select * 
from TEMP_LEDGERPERIOD
where FiscalPeriod BETWEEN '2016-01-01' AND '2016-02-01';

最后,您是否意识到BETWEEN 包含在内,因此包括二月的第一天。

【讨论】:

  • 我能想到的一种将'01-' 前置的格式是MMM-YY,例如JAN-16。当然,可能有更安全的转换方式,但它应该可以工作,
猜你喜欢
  • 2020-10-09
  • 2013-03-13
  • 1970-01-01
  • 2013-09-16
  • 2019-10-20
  • 2012-04-17
相关资源
最近更新 更多