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>
我在 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>