我有约会和时间存储在表格中的时间。一列(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
列,我会得到相同的结果。
这是我输出到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输出中,我该如何解决?
答案 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>