Tsql 返回与DateTime不匹配的空字符串
表[docSVdate]Tsql 返回与DateTime不匹配的空字符串,tsql,datetime,sql-server-2008-r2,Tsql,Datetime,Sql Server 2008 R2,表[docSVdate] PK sID,fielID 值DateTime不为空 如果给定PK(sID,fieldID)没有行,我需要返回一个空字符串 这是我能想到的最好的了 有人有更高效的吗 select isnull(convert(varchar,[docSVdate].[value]), '') from [docSVsys] as [pholder] with (nolock) left join [docSVdate] on [docSVdate].
PK sID,fielID
值DateTime不为空 如果给定PK(sID,fieldID)没有行,我需要返回一个空字符串
这是我能想到的最好的了
有人有更高效的吗
select isnull(convert(varchar,[docSVdate].[value]), '')
from [docSVsys] as [pholder] with (nolock)
left join [docSVdate]
on [docSVdate].[sID] = [pholder].[sID]
and [docSVdate].[fieldID] = 117
where [pholder].[sID] = 6485
如果在SQL中将
datetime
转换为varchar
,则将SQL Server的语言和区域性设置引入到日期字符串中。根据所使用的格式,您也可能会丢失精度。如果应用程序代码解析字符串的方式与SQL生成的不同,则可能会出现错误
所以简单的答案是——不要这样做。只需将其作为datetime
返回即可。让调用应用程序直接使用它,而不转换为字符串。如有必要,在调用应用程序中检查null
如果你真的想这么做,那么有很多技术可能会奏效,包括你展示的连接,以及路易斯在回答中展示的变量。下面是另一种技术,它使用嵌套查询。也许这就是你想要的:
SELECT ISNULL(
(select convert(varchar, [value])
from [docSVDate]
where [sID] = 6485 and [fieldID] = 117
), '') as [value]
请注意,从
datetime
到varchar
的转换涉及格式设置,无论您是否喜欢。如果您没有指定任何内容,那么您将获得运行在其上的任何系统的默认值。对于我来说,在使用美国英语设置的数据库上运行时,我的默认格式看起来像“Jul 21 2013 4:41PM”
,但如果我有不同的语言设置,我可能会得到完全不同的结果。您可能应该传递一个格式说明符来指示您要查找的格式。请参考MSDN参考中有关转换/转换的。如果在SQL中将datetime
转换为varchar
,则将SQL Server的语言和区域性设置引入到日期字符串中。根据所使用的格式,您也可能会丢失精度。如果应用程序代码解析字符串的方式与SQL生成的不同,则可能会出现错误
所以简单的答案是——不要这样做。只需将其作为datetime
返回即可。让调用应用程序直接使用它,而不转换为字符串。如有必要,在调用应用程序中检查null
如果你真的想这么做,那么有很多技术可能会奏效,包括你展示的连接,以及路易斯在回答中展示的变量。下面是另一种技术,它使用嵌套查询。也许这就是你想要的:
SELECT ISNULL(
(select convert(varchar, [value])
from [docSVDate]
where [sID] = 6485 and [fieldID] = 117
), '') as [value]
请注意,从
datetime
到varchar
的转换涉及格式设置,无论您是否喜欢。如果您没有指定任何内容,那么您将获得运行在其上的任何系统的默认值。对于我来说,在使用美国英语设置的数据库上运行时,我的默认格式看起来像“Jul 21 2013 4:41PM”
,但如果我有不同的语言设置,我可能会得到完全不同的结果。您可能应该传递一个格式说明符来指示您要查找的格式。请参考MSDN参考中有关转换/转换的部分。如果只是一行…
内部连接?
我不确定执行计划会显示什么
DECLARE @Value VARCHAR(50)
SET @Value = ''
SELECT @Value = convert(varchar,[docSVdate].[value])
FROM [docSVsys] as [pholder] with (nolock)
INNER JOIN [docSVdate]
ON [docSVdate].[sID] = [pholder].[sID]
AND [docSVdate].[fieldID] = 117
WHERE [pholder].[sID] = 6485
SELECT @Value as Value
根本不需要联接。最多一行作为主键的位置
DECLARE @Value VARCHAR(50)
SET @Value = ''
SELECT @Value = convert(varchar,[docSVdate].[value])
FROM [docSVdate]
WHERE [docSVdate].[sID] = 6485
AND [docSVdate].[fieldID] = 117
SELECT @Value as Value
如果只有一行… 内部连接? 我不确定执行计划会显示什么
DECLARE @Value VARCHAR(50)
SET @Value = ''
SELECT @Value = convert(varchar,[docSVdate].[value])
FROM [docSVsys] as [pholder] with (nolock)
INNER JOIN [docSVdate]
ON [docSVdate].[sID] = [pholder].[sID]
AND [docSVdate].[fieldID] = 117
WHERE [pholder].[sID] = 6485
SELECT @Value as Value
根本不需要联接。最多一行作为主键的位置
DECLARE @Value VARCHAR(50)
SET @Value = ''
SELECT @Value = convert(varchar,[docSVdate].[value])
FROM [docSVdate]
WHERE [docSVdate].[sID] = 6485
AND [docSVdate].[fieldID] = 117
SELECT @Value as Value
这可能不是你想要的答案,但它确实引发了一个需要考虑的问题:你如何处理匹配的行?您是否关心值是否以字符串形式返回,或者您是否需要使用日期时间?@Blam-请提供一个示例,说明您要查找的日期/时间字符串的所需格式。@MattJohnson为什么,问题不在于格式。提供的示例代码生成可接受的格式。所提出的问题是“有人有更高效的吗?”@StuartAinsworth,真的吗?想想看。空字符串不是有效的DataTime,因此它显然不能返回DateTime。我需要的正是我想要的。我需要返回一个空字符串表示不匹配。这根本不是所述问题的答案。它可能不是您正在寻找的答案,但它确实引发了一个应该考虑的问题:您如何处理匹配的行?您是否关心值是否以字符串形式返回,或者您是否需要使用日期时间?@Blam-请提供一个示例,说明您要查找的日期/时间字符串的所需格式。@MattJohnson为什么,问题不在于格式。提供的示例代码生成可接受的格式。所提出的问题是“有人有更高效的吗?”@StuartAinsworth,真的吗?想想看。空字符串不是有效的DataTime,因此它显然不能返回DateTime。我需要的正是我想要的。我需要返回一个空字符串来表示不匹配。根本不需要联接。我用它来建立一个更大的查询,所以格式不适合,但它很光滑。如果你不需要连接,那么这肯定是最快的。根本不需要连接。我用它来建立一个更大的查询,这样格式就不适合了,但是它很光滑。如果你不需要加入,那么这肯定是最快的。