【问题标题】:Conversion of Varchar Data type to a datetime datatype resulted in an out-of-range value将 Varchar 数据类型转换为 datetime 数据类型导致值超出范围
【发布时间】:2016-02-08 21:29:06
【问题描述】:

我的 SQL 问题有问题。我有两列日期。 FinDt 和 DesProDt 是 Int。有时 FinDt 为 0,有时 DesProDt 为 0。我需要检查它们是否从一开始就为 0。如果其中任何一个是 0,那么我想显示 0,否则我想在两个日期之间做一个 dateDiff 以获得一个值。

CASE WHEN (CAST(F0001.dbo.OrdLn.DesProDt AS VARCHAR) = 0 
     OR CAST(F0001.dbo.OrdLn.FinDt AS VARCHAR) = 0) 
     THEN 0 
     ELSE DATEDIFF(D , CONVERT (datetime , CONVERT (varchar , F0001.dbo.OrdLn.DesProDt)) , CONVERT (datetime , CONVERT (varchar , F0001.dbo.OrdLn.FinDt))) 
END

我不明白我做错了什么。我收到一条错误消息,提示将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

有人可以帮帮我吗?

谢谢!

【问题讨论】:

  • 日期为 varchar,格式可能不同 2015-01-21 或 2015-21-01。试试SET DATEFORMAT dmymdy
  • “我做错了什么” - 将日期存储为 int 是错误的。如果你解释一下你是如何将日期存储为int,那么有人可以帮助你。
  • 您还比较了转换为 varchar 和 int 的结果:为什么?将其与字符串 '0' 进行比较。
  • 我正在使用业务系统,他们决定将日期存储为 int,因此我无法更改此设置。我试图将 0 更改为“0”,但没有成功。如果我删除 Case 部分,那么 datediff 会一直工作,直到找到日期为 0 的帖子。所以我知道该部分正在工作。日期以 20151106 格式存储为 int。
  • 要么所有数据都失败,要么有一行或多行包含无效数据。您需要通过更多的故障排除来解决这个问题。也许从这些列中发布一些数据。

标签: sql-server-2008 tsql datetime datediff


【解决方案1】:

您有一个或多个无效值。你必须找到他们。它们将位于排序的开头或结尾。

select F0001.dbo.OrdLn.DesProDt from table order by F0001.dbo.OrdLn.DesProDt  
select F0001.dbo.OrdLn.FinDt    from table order by F0001.dbo.OrdLn.FinDt

【讨论】:

  • 谢谢你,我会试试看我会得到什么结果!
  • 我尝试了上述方法,所有字段要么为 0,要么具有类似“20150101”的日期,我将代码修改为如下所示,但它也不起作用。 CASE WHEN (F0001.dbo.OrdLn.DesProDt 0 AND F0001.dbo.OrdLn.FinDt 0) THEN ISNULL(CAST(DATEDIFF(D, CONVERT(date, CONVERT(datetime, CONVERT(varchar(8), F0001 .dbo.OrdLn.DesProDt), 112)), CONVERT(date, CONVERT(datetime, CONVERT(varchar(8), F0001.dbo.OrdLn.FinDt), 112))) AS INT), 0) END AS [Dagar森]
  • 循环查找失败。我严重怀疑像“20150101”这样的日期会失败。
  • 所以所有字段都为 0 或日期为 20150101 但问题是 1013?
  • 我有一篇帖子的日期为 10130112 而不是 20130112,所以我更正了它并且它有效!
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 2014-01-17
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多