带有HTML输出的SQL日期格式

时间:2017-09-18 12:37:14

标签: sql sql-server sql-server-2005

我有约会和时间存储在表格中的时间。一列(moddate)采用datetime格式,但不幸的是,时间记录在modtime的另一列(varchar(8))中。这不能改变。所有datetime行都有00:00:00个时间。我想将这些列加在一起以实现05/07/2017 16:54之类的东西,这在我在SSMS中选择时似乎有效。

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),没有时间列。如果我只选择datetime列,我会得到相同的结果。

Incorrectly displayed dates in HTML format

这是我输出到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' ;  

创建表格的脚本不起眼,唯一感兴趣的行是:

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

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

3 个答案:

答案 0 :(得分:0)

假设您的时间字符串格式为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+)。 E.g。

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

会在你的问题中给你格式化。

答案 1 :(得分:0)

@moddate + ' ' + @modtime会生成datetime类型,因此会相应地序列化(采用ISO8601格式 - 因此为T)。

如果您需要不同的格式,则需要显式转换为字符串:

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

答案 2 :(得分:0)

这是一个解决方法,但你可以使用它:

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>