Sql 使用强制转换时,从字符串转换日期和/或时间时,转换失败

Sql 使用强制转换时,从字符串转换日期和/或时间时,转换失败,sql,sql-server,tsql,Sql,Sql Server,Tsql,为什么在使用带有日期和时间的cast时会出现此错误?在它工作之前,但现在它不工作了。我需要改变什么 这是select语句: SELECT [Order_Payments].[order_id] as 'Order No.' , try_convert(numeric(38,2),order_vat) as 'VAT value' , try_convert(numeric(38,2),vat_orders.[total_amount]) as 'Total A

为什么在使用带有日期和时间的cast时会出现此错误?在它工作之前,但现在它不工作了。我需要改变什么

这是select语句:

SELECT
      [Order_Payments].[order_id] as 'Order No.'
      , try_convert(numeric(38,2),order_vat) as 'VAT value'
      , try_convert(numeric(38,2),vat_orders.[total_amount]) as 'Total After VAT'
      , [Order_Payments].cash as 'Cash'
      , Order_Payments.mada as 'Mada'
      , Order_Payments.visa as 'Visa'
      , vat_orders.order_date AS 'Order Date'
      , cast(vat_orders.order_date as time) as [time]
      , Customers.CustName as 'Clinic'
      , patients.patient_name as 'Patient Name'       
  FROM [Order_Payments]
  INNER JOIN vat_orders ON [Order_Payments].order_id = vat_orders.ORDER_ID
  INNER JOIN Customers ON [Order_Payments].custid = Customers.CustId
  INNER JOIN Patients ON [Order_Payments].patient_no = patients.patient_no
  WHERE CAST(vat_orders.order_date AS time) BETWEEN '00:00:09' AND '23:59:80'
  AND CAST(vat_orders.order_date AS date) BETWEEN '2021-05-01' AND '2021-05-05'
  AND order_payments.custid = 271
  ORDER BY Order_Payments.custid, Order_Payments.order_id

强制转换where子句中的错误。请帮助。

多亏了拉穆,秒数错误的问题变成了80,现在我把它改成了59,当施放80秒超过60秒时,它的工作状态无法转换

我尝试在24小时内选择订单时间

SELECT
      [Order_Payments].[order_id] as 'Order No.'
      , try_convert(numeric(38,2),order_vat) as 'VAT value'
      , try_convert(numeric(38,2),vat_orders.[total_amount]) as 'Total After VAT'
      , [Order_Payments].cash as 'Cash'
      , Order_Payments.mada as 'Mada'
      , Order_Payments.visa as 'Visa'
      , vat_orders.order_date AS 'Order Date'
      , cast(vat_orders.order_date as time) as [time]
      , Customers.CustName as 'Clinic'
      , patients.patient_name as 'Patient Name'       
  FROM [Order_Payments]
  INNER JOIN vat_orders ON [Order_Payments].order_id = vat_orders.ORDER_ID
  INNER JOIN Customers ON [Order_Payments].custid = Customers.CustId
  INNER JOIN Patients ON [Order_Payments].patient_no = patients.patient_no
  WHERE CAST(vat_orders.order_date AS time) BETWEEN '00:00:01' AND '23:59:59'
  AND CAST(vat_orders.order_date AS date) BETWEEN '2021-05-01' AND '2021-05-05'
  AND order_payments.custid = 271
  ORDER BY Order_Payments.custid, Order_Payments.order_id

您需要提供一个包含导致问题的示例数据的示例。根据错误,您将日期时间值存储为字符串,这是一个非常糟糕的设计决策,现在您必须查找其中的一些不正确数据。另外,请逐字记录错误。23:59:80是多少?您已经在使用try\u convertnumeric38,2,。。。。为什么不使用try_converttime,。。。如果转换失败,它将返回一个错误。@Martin Smith I可以查看100次,但不注册:80I必须承认,CASTvat_orders.order_date作为“00:00:09”和“23:59:80”之间的时间到底是什么?80是什么意思?看起来你想把一整天都包括在内,那么为什么不干脆和order_date>='20210501'和order_date<'20210506'呢。或者你真的不是在每天的前9秒钟内没有发生的订单之后?如果是这样的话,您最好将时间值作为计算和索引列添加到表中。时间00:00:00如何?@DaleK我使用的是00:00:01而不是00:00:00,也可以从00:00:00开始。谢谢。@Larnu的评论建议了一种比较日期而忽略时间的更好方法。顺便说一句,你应该非常小心,以了解between的工作原理,因为它并不总是合乎逻辑的。@DaleK事实上,我在安装系统时遇到了一些计算机错误,在两个日期之间选择不直接工作,我必须将计算机语言从阿拉伯语区域更改为英语-美国语言,然后系统和选择“开始工作”,这是来自演员阵容吗?C系统。@ZiadAdnan最有可能的问题来自于在应用程序中生成查询的方法。另一个很好的猜测是,您不需要参数化查询,而是通过将应该是参数的日期和时间以及客户ID连接到SELECT语句字符串中来构建查询。