SQL 具有 HTML 输出的日期格式

SQL Date format with HTML output

我在 table 中存储了一个日期和时间。一栏 (moddate) 是 datetime 格式,但不幸的是,时间记录在另一栏 (modtime) 中,即 varchar(8)。这是无法改变的。所有 datetime 行的时间都是 00:00:00。我想将这些列连接在一起以实现类似 05/07/2017 16:54 的效果,当我在 SSMS 中 select 时,它似乎有效。

SSMS 的示例输出

+--------------------------------------+--------------+----------+-------------------------+-------------+
|             Description              |    Code1     |  Code2   |      Date Modified      | Modified By |
+--------------------------------------+--------------+----------+-------------------------+-------------+
| Other Costs & Benefits - Other Costs | 70-0-1-04-00 | 70010400 | 2017-07-05 16:54:00.000 | dave        |
+--------------------------------------+--------------+----------+-------------------------+-------------+

当我输出到HTML时,它显示为2017-07-05T00:00:00(注意中间的T),没有时间栏。如果我只 select datetime 列,我会得到相同的结果。

这是我要输出到 HTML 和电子邮件的代码。

DECLARE @tableHTML  NVARCHAR(MAX) ;  

SET @tableHTML =  
    N'<H2>Title</H2>' +  
    N'<table border="1">' +  
    N'<tr><th>Description</th><th>Code 1</th>' +  
    N'<th>Code 2</th><th>Date Modified</th><th>Modified by</th>' +  
    N'</tr>' +  
    CAST ( ( select
      td = [des], '',
       td = [maskednum], '',
      td = [num], '',
       td = [moddate] + ' ' + [modtime], '',
       td = [moduser], '' 
      from galtable
       where [moddate] >= DATEADD(MONTH, -3, GETDATE())
              FOR XML PATH('tr'), TYPE   
    ) AS NVARCHAR(MAX) ) +  
    N'</table>' ;  

EXEC msdb.dbo.sp_send_dbmail @recipients='emailaddresshere@email.com',  
    @subject = 'Subject',  
    @body = @tableHTML,  
    @body_format = 'HTML' ;  

创建 table 的脚本很普通,唯一感兴趣的行是:

[moddate] [datetime] NULL,
[modtime] [varchar](8) NULL,

我的问题是:为什么它没有在 HTML 输出中正确显示我的日期和时间,我该如何解决?

假设您的时间字符串格式为 HH:MM:ss,那么以下内容将在 DATETIME 中为您提供日期和时间:

[moddate]+CAST([modtime] AS DATETIME)

在一个字段中需要日期和时间的地方使用该表达式。

如果该值应该以特定格式被人类读取,您可以使用 CONVERT 函数。这会给你 YYYY-MM-DD HH:mm:SS:

CONVERT(VARCHAR(20),[moddate]+CAST([modtime] AS DATETIME),120)

或者您可以使用 FORMAT 函数进行更精确的格式化(对于 SQL Server 2012+)。例如

FORMAT([moddate]+CAST([modtime] AS DATETIME),'dd/MM/yyyy HH:mm')

会给你问题中的格式。

@moddate + ' ' + @modtime 导致 datetime 类型,因此被相应地序列化(以 ISO8601 格式 - 因此 T)。

如果你想要不同的格式,你需要明确地转换成一个字符串:

td = convert(varchar(19), @moddate + ' ' + @modtime, 20)

这是一种解决方法,但您可以使用它:

select '<tr>'+ convert(varchar, DATEADD(MONTH, -3, GETDATE()), 121) +'</tr>'

编辑: 无法重现问题。我还添加了转换(不确定应该是什么数据类型):

declare @galtable table ([des]varchar(10) DEFAULT '', [maskednum]varchar(10) DEFAULT '', [num]varchar(10) DEFAULT '', [moddate] date DEFAULT cast(getdate() as date), [modtime] time DEFAULT cast(getdate() as time), [moduser]varchar(10) DEFAULT '')
insert into @galtable ([deS]) select '1'
declare @tableHTML varchar(max)
SET @tableHTML =  
    N'<H2>Title</H2>' +  
    N'<table border="1">' +  
    N'<tr><th>Description</th><th>Code 1</th>' +  
    N'<th>Code 2</th><th>Date Modified</th><th>Modified by</th>' +  
    N'</tr>' +  
    CAST ( ( select top 1
      td = [des], '',
       td = [maskednum], '',
      td = [num], '',
       td = cast([moddate] as varchar(20)) + ' ' + cast([modtime] as varchar(20)), '',
       td = [moduser], '' 
      from @galtable
       where [moddate] >= DATEADD(MONTH, -3, GETDATE())
              FOR XML PATH('tr'), TYPE   
    ) AS NVARCHAR(MAX) 
    ) +  
    N'</table>' ;  

print @tableHTML

结果是:

<H2>Title</H2><table border="1"><tr><th>Description</th><th>Code 1</th><th>Code 2</th><th>Date Modified</th><th>Modified by</th></tr><tr><td>1</td><td/><td/><td>2017-09-18 16:02:01.5200000</td><td/></tr></table>