Tsql 返回与DateTime不匹配的空字符串

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].

表[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。我需要的正是我想要的。我需要返回一个空字符串来表示不匹配。根本不需要联接。我用它来建立一个更大的查询,所以格式不适合,但它很光滑。如果你不需要连接,那么这肯定是最快的。根本不需要连接。我用它来建立一个更大的查询,这样格式就不适合了,但是它很光滑。如果你不需要加入,那么这肯定是最快的。