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