Формат даты и времени не делает то, что должен делать
Итак, у меня есть столбец datetime, который я хочу преобразовать в smalldatetime в моем отчете. Я ожидаю что-то вроде:
2011-07-13 09:51:21.087 to 2011-07-13 09:51:21
Просто верно? Ну, столбец datetime возвращает T вместо пробела, поэтому я решил, что преобразование должно удалить это, но безрезультатно... мысли?
SELECT LockoutDate
CONVERT(smalldatetime,LockoutDate)[Small Date]
LockoutDate | Small Date
2011-07-13T09:51:21.087 | 2011-07-13T09:51:00
Что это за "Т" и почему оно там? Опять же, фактический столбец - это datetime, а не nvarchar или что-то еще...
РЕДАКТИРОВАТЬ: Вот код, над которым я работаю.
DECLARE @tableLockPass NVARCHAR(MAX);
SET @tableLockPass = --Statement to check active accounts that are locked
N'<H3>Locked SQL Accounts</H3>' +
N'<table border="2" style="font-size:12px">' +
N'<tr>' +
N'<th>Instance</th>' +
N'<th>Instance Purpose</th>' +
N'<th>Domain Account</th>' +
N'<th>Name</th>' +
N'<th>Account Lock</th>' +
N'<th>Lockout Time</th>' +
N'</tr>' +
CAST ((
SELECT
[td/@align] = 'center',
td = [Instance], '',
[td/@align] = 'center',
td = [Instance Purpose], '',
[td/@align] = 'center',
td = Name, '',
[td/@align] = 'center',
td = [Display Name], '',
[td/@align] = 'center',
td = [Account Lock], '',
[td/@align] = 'center',
td = [Lockout Time], ''
FROM(
SELECT Name
,ADDisplayName [Display Name]
,Instance
,InstancePurpose [Instance Purpose]
,replace(IsLocked,1,'In Place') as [Account Lock]
,convert(smalldatetime,LockoutTime,120) [Lockout Time]
FROM dbo.Security
WHERE IsLocked = 1
) AS DS
ORDER BY Instance, [Display Name]
FOR XML PATH('tr'), TYPE
)AS NVARCHAR(MAX) ) +
N'</table>';
IF @tableLockPass IS NOT NULL
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL_DBMail',
@importance = 'NORMAL',
@recipients = '',
@subject = '',
@body = @tableLockPass,
@body_format = 'HTML';
Я не знаю, слабый ли это код или нет. Я все еще довольно новичок в SQL, так что это то, что я бросил вместе.
В результате получается симпатичный столик, подобный этому:
Экземпляр [Назначение экземпляра] Имя [Блокировка учетной записи] [Время блокировки]
DEV5 Общее использование BMMcClure на месте 2011-07-13T09:51:00
1 ответ
T - это просто стандартный (ISO 8601) способ определения времени.
Добавление СТИЛЯ в CONVERT
Функция для указания, как перевести выражение:
SELECT LockoutDate,
CONVERT(smalldatetime,LockoutDate,120) [Small Date]
РЕДАКТИРОВАТЬ: на ваш полный код
DECLARE @tableLockPass NVARCHAR(MAX);
SET @tableLockPass = --Statement to check active accounts that are locked
N'<H3>Locked SQL Accounts</H3>' +
N'<table border="2" style="font-size:12px">' +
N'<tr>' +
N'<th>Instance</th>' +
N'<th>Instance Purpose</th>' +
N'<th>Domain Account</th>' +
N'<th>Name</th>' +
N'<th>Account Lock</th>' +
N'<th>Lockout Time</th>' +
N'</tr>' +
CAST ((
SELECT
[td/@align] = 'center',
td = [Instance], '',
[td/@align] = 'center',
td = [Instance Purpose], '',
[td/@align] = 'center',
td = Name, '',
[td/@align] = 'center',
td = [Display Name], '',
[td/@align] = 'center',
td = [Account Lock], '',
[td/@align] = 'center',
td = convert(smalldatetime,[Lockout Time],120), ''
FROM(
SELECT Name
,ADDisplayName [Display Name]
,Instance
,InstancePurpose [Instance Purpose]
,replace(IsLocked,1,'In Place') as [Account Lock]
,convert(smalldatetime,LockoutTime,120) [Lockout Time]
FROM dbo.Security
WHERE IsLocked = 1
) AS DS
ORDER BY Instance, [Display Name]
FOR XML PATH('tr'), TYPE
)AS NVARCHAR(MAX) ) +
N'</table>';
IF @tableLockPass IS NOT NULL
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL_DBMail',
@importance = 'NORMAL',
@recipients = '',
@subject = '',
@body = @tableLockPass,
@body_format = 'HTML';