【问题标题】:Conversion failed when converting date and/or time from character string - why?从字符串转换日期和/或时间时转换失败 - 为什么?
【发布时间】:2019-12-31 07:20:08
【问题描述】:

这是一个 SQL 子查询,它给出的错误是

“从字符串转换日期和/或时间时转换失败。”。

我尝试用 datetime2 替换 datetime,但它不起作用。

declare @cols as NVARCHAR(max)
, @cols2 as NVARCHAR(max)
, @query as NVARCHAR(max) select
  @cols = STUFF(
    (
      select
        ',' + QUOTENAME(ProductOptionName)
      from
        OrderProductVariantOption [NL]
        inner join OrderProductVariant [NL] on
          OrderProductVariant.Id = OrderProductVariantOption.OrderProductVariantId
        where
          (
            OrderProductVariant.AcceptedById = '[Business|0]'
            or OrderProductVariant.MRefId = '[Business|0]'
          )
          and [OrderProductVariant.MarketplaceGroupId=Marketplace]
          and OrderProductVariant.DateCreated >= cast(cast('[startdate]' as date) as datetime2)
          and OrderProductVariant.DateCreated < cast(cast('[enddate]' as date) as datetime2)
        group by
          ProductOptionName
        order by
          ProductOptionName for XML path('')
          , TYPE
    )
    . value('.', 'NVARCHAR(MAX)')
    , 1
    , 1
    , ''
  )

【问题讨论】:

  • 能否分享一些示例数据?

标签: sql-server sql-server-2008 datetime type-conversion


【解决方案1】:
  1. 删除 [NL],因为 [NL] 被多次使用。

  2. 也许 OrderProductVariant.DateCreated 日期格式不同。所以也要更正它的格式。

    and cast(OrderProductVariant.DateCreated as date) >= cast([startdate] as date)

最后,你的代码会是这样的:

 declare @cols as NVARCHAR(max)
, @cols2 as NVARCHAR(max)
, @query as NVARCHAR(max) select
  @cols = STUFF(
    (
      select
        ',' + QUOTENAME(ProductOptionName)
      from
        OrderProductVariantOption 
        inner join OrderProductVariant on
          OrderProductVariant.Id = OrderProductVariantOption.OrderProductVariantId
        where
          (
            OrderProductVariant.AcceptedById = '[Business|0]'
            or OrderProductVariant.MRefId = '[Business|0]'
          )
          and [OrderProductVariant.MarketplaceGroupId=Marketplace]
        and cast(OrderProductVariant.DateCreated as date) >= cast([startdate] as date)
        and cast(OrderProductVariant.DateCreated as date) < cast([enddate] as date)
        group by
          ProductOptionName
        order by
          ProductOptionName for XML path('')
          , TYPE
    )
    . value('.', 'NVARCHAR(MAX)')
    , 1
    , 1
    , ''
  )

【讨论】:

    【解决方案2】:

    您需要更新您的查询,因为您的查询中存在一些语法问题。在sql server 中使用[] 来声明您的列名。 '' 用于声明字符串值。所以从你的日期列中删除'

    还需要删除表别名[NL],因为您为两个表声明了相同的别名并直接在查询中使用表名。

    最重要的是,您的选择查询从声明语句开始,这进一步给出了错误。从下一行写下您的查询。

    declare @cols as NVARCHAR(max)
    , @cols2 as NVARCHAR(max)
    , @query as NVARCHAR(max) 
    
    select
      @cols = STUFF(
        (
          select
            ',' + QUOTENAME(ProductOptionName)
          from
            OrderProductVariantOption      ---- remove [NL] since you are using table name directly in your query
            inner join OrderProductVariant  on
              OrderProductVariant.Id = OrderProductVariantOption.OrderProductVariantId
            where
              (
                OrderProductVariant.AcceptedById = '[Business|0]'  --- check over there too
                or OrderProductVariant.MRefId = '[Business|0]'
              )
              and [OrderProductVariant.MarketplaceGroupId=Marketplace]
              and OrderProductVariant.DateCreated >= cast([startdate] as date) 
              and OrderProductVariant.DateCreated < cast([enddate] as date) 
            group by
              ProductOptionName
            order by
              ProductOptionName for XML path('')
              , TYPE
        )
        . value('.', 'NVARCHAR(MAX)')
        , 1
        , 1
        , ''
      )
    
    

    【讨论】:

      【解决方案3】:

      '[startdate]''[enddate]' 是文字字符串值 - 您不会尝试将名为 startdate(或 enddate)的列中的值转换为日期,而是实际字符串值:[startDate](或[enddate])。
      自然,这些字符串不能转换为日期值。

      此外,您的查询中还有另一个问题 - 您试图对连接中的两个表使用相同的别名 - 这将导致以下错误:

      在 FROM 子句中多次指定相关名称“NL”。

      【讨论】:

        【解决方案4】:

        使用这个:

        and OrderProductVariant.DateCreated >= Convert(datetime,[startdate])
        and OrderProductVariant.DateCreated < Convert(datetime,[enddate])
        

        【讨论】:

          【解决方案5】:

          您引用了[startdate][enddate]。因此,它们是常量字符串值 [startdate] 和 [enddate],不再是字段名称。 试试

                    and OrderProductVariant.DateCreated >= cast([startdate] as date)
                    and OrderProductVariant.DateCreated < cast([enddate] as date)
          

          您应该使用CONVERT 函数而不是CAST,因为您可以将日期格式设置为参数。

          【讨论】:

            猜你喜欢
            • 2012-04-17
            • 2017-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多