返回空字符串,在DateTime上不匹配

时间:2013-07-20 17:35:37

标签: tsql datetime sql-server-2008-r2

表[docSVdate]
PK sID,fielID
value DateTime not null

如果给定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

2 个答案:

答案 0 :(得分:2)

如果在SQL中将datetime转换为varchar,则会将SQL Server的语言和区域性设置引入日期字符串中。您可能也会失去精度,具体取决于所使用的格式。如果应用程序代码以不同于SQL生成它的方式解析字符串,则可能会出错。

所以简单的答案是 - 不要这样做。只需将其作为datetime返回。让调用应用程序直接使用它而不转换为字符串。如果需要,在调用应用程序中检查null。

如果真的想要这样做,那么有许多技术可能会起作用,包括你展示的连接,以及Luis在他的回答中显示的变量。这是另一种使用嵌套查询的技术。也许这就是你要找的东西:

SELECT ISNULL(
    (select convert(varchar, [value])
     from [docSVDate]
     where [sID] = 6485 and [fieldID] = 117
    ), '') as [value]

请注意,从datetimevarchar的转换涉及格式化,无论您是否喜欢。如果未指定任何内容,则会获得正在运行的任何系统的默认值。对我来说,在使用美国英语设置的数据库上运行时,我的默认格式看起来像"Jul 21 2013 4:41PM"但是如果我有不同的语言设置,我可能会得到完全不同的结果。您应该传递格式说明符以指示您要查找的格式。请参阅MSDN参考中的Date and Time Styles remarks以进行强制转换。

答案 1 :(得分:2)

如果它只是一行......

INNER JOIN? 我不确定执行计划会显示什么

  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

根本不需要加入。
最多的一行是PK,

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