Преобразование даты и времени в SQL
Всем Привет,
Я использую приведенный ниже запрос для перечисления моих баз данных, которые не имеют резервной копии журнала За последние 2 часа. Я получаю "т" в своем выводе с уважением к дате и времени. Я пробую много разных способов преобразовать его, но безуспешно. Может ли кто - нибудь помочь мне в лучшем выходе, который не имеет "Т" между датой и временем.
declare @xml nvarchar(max) declare @datetime datetime declare @now nvarchar(max) declare @body nvarchar(max) set language ENGLISH --set @now= DATEADD (hour,-2,getdate()) --select * from sys.databases where recovery_model_desc='FULL' if exists (select 'x' from sysobjects where name ='temp_tbl') begin drop table temp_tbl end select database_name,type,max(backup_start_date) backupdate into temp_tbl from msdb.dbo.backupset where database_name in (select name from sys.databases where recovery_model_desc='FULL') group by database_name,type order by database_name,type if exists (select 'x' from sysobjects where name ='final_table') begin drop table final_table end create table final_table(DBName nvarchar(500),FullBackup_date datetime, LogBackupDate datetime) insert into final_table(DBName) selecT distinct Database_name From temp_tbl update x set x.FullBackup_date=y.backupdate from final_table x,temp_tbl y where x.DBname=y.database_name and y.type='D' update x set x.LogBackupDate=y.backupdate from final_table x,temp_tbl y where x.DBname=y.database_name and y.type='L' set @xml= (select CAST(( selecT DBName as 'td', '', FullBackup_date as 'td', '', LogBackupDate as 'td' FROM final_table where LogBackupDate < (convert (varchar(30), (dateadd(hour,-2,getdate())),121)) for xml path ('tr'),elements) as nvarchar(max) ) ) SET @body = '<h3> Databases not backed up for last 2 hours </h3> ' begin SET @body = @body + @xml + '<table border="1"><tbody><tr> <th> DBName </th><th> FullBackup_date </th><th> LogBackupDate </th></tr></tbody></table>' declare @subject varchar(250) select @subject = 'Warning: Databases has no log backup for last 2 hours' EXEC msdb.dbo.sp_send_dbmail @profile_name = 'DBAs', @recipients = 'anjum.sumaiyas@lowes.com', -- @subject = N'Databases not backed for last 2 hrs', @body = @body, @body_format ='HTML', @subject = @subject; END set nocount off
Что я уже пробовал:
я получаю результат как таковой
Имя_бд FullBackup_date LogBackupDate
DB1 2019-04-01T06:21:25 2019-04-01T06:52:31
DB2 2019-02-18T07:08:47 2019-04-01T06:52:29
DB3 2019-02-18T07:08:25 2019-04-01T06:52:08
Herman<T>.Instance
Подсказка: выберите формат(@datetime,'yyyyMMddHHmmss')
Anjum18
Спасибо @digimanus! но это не сработает!
CHill60
Digimanus не будет знать, что вы ответили, Если вы не используете кнопку "ответить" на его сообщение. Я только что попробовал
SELECT FORMAT(getdate(), 'yyyyMMddHHmmss')и получил результат
20190409144603
Итак, его решение делает работа
CHill60
Почему вы хотите его преобразовать? С какой стати вы преобразуете datetime в varchar? Особенно в предложении where! Это действительный datetime, вы заинтересованы в datetime, так что оставьте его как ... datetime
Anjum18
Эй, Остынь!,
Я просто хочу, чтобы мой вывод выглядел без буквы "Т". Кто-нибудь поможет?
CHill60
Сделайте это в графическом интерфейсе, а не в SQL. Это не дает ответа на вопрос, почему вы преобразуете DateTime в Varchar в предложении WHERE.
Я увидел это только случайно - см. Мой комментарий к вашему ответу на @Digimanus - используйте ссылку "ответить", чтобы люди были уведомлены о вашем ответе.
Maciej Los
5ed!
Anjum18
Спасибо! я изменил тип данных на datetime. текущий выход выглядит хорошо, но в качестве стандарта мне нужно следовать метке времени без " т " в моем выходе. Кроме того, я правильно получаю свой вывод, когда запускаю его в SSMS, но в электронной почте я получаю " Т " между датой и временем.
Если вы можете отредактировать мой приведенный ниже скрипт и дать мне выходные данные в формате 'YYYYMMDD HHMMSS'...
объявить @xml nvarchar(макс.)
объявить @datetime datetime
объявить @now nvarchar(max)
объявить @body nvarchar(макс.)
установить язык английский
если существует (выберите 'x' из sysobjects, где name ='temp_tbl')
начать
откидной столик temp_tbl
конец
выберите database_name,type,max(backup_start_date) backupdate
в temp_tbl из данных msdb.ДБО.набора
где database_name в
(выберите имя из sys.databases, где recovery_model_desc='FULL')
группа по имя_базы данных,тип
порядок по имени базы данных,тип
если существует (выберите 'x' из sysobjects, где name ='final_table')
начать
падение final_table стол
конец
создайте таблицу final_table(DBName nvarchar(500),FullBackup_date datetime, LogBackupDate datetime)
вставить в final_table(DBName)
выбрать различные Имя_базы_данных от temp_tbl
обновление x
установите x.FullBackup_date=y.backupdate
из final_table х,temp_tbl г
где x.DBname=y.database_name
и y.type='D'
обновление x
установите x.LogBackupDate=y.backupdate
из final_table х,temp_tbl г
где x.DBname=y.database_name
и y.type='L'
set @xml= (выберите CAST((
выберите DBName как 'td', ",
FullBackup_date как 'td', ",
LogBackupDate как 'td'
Из final_table где LogBackupDate &ЛТ; (конвертации (дату и время (функция dateadd(час,-2,getdate ()) для),121))
для xml path ('tr'),elements) as nvarchar(max) )
)
SET @body =
'
Базы данных не были скопированы за последние 2 часа
'
начать
SET @body = @body + @xml + ' DBName FullBackup_date LogBackupDate '
объявить @subject varchar(250)
выберите @тема = 'предупреждение: базы данных нет резервное копирование журнала За последние 2 часа
Старпома данных msdb.ДБО.процедура sp_send_dbmail
@profile_name = 'DBA',
@получатели = 'WWW@yyy.com',
-- @subject = N 'Databases не поддерживается в течение последних 2 часов',
@тело = @организма,
@body_format ='HTML',
@тема = @предмет;
КОНЕЦ
установить nocount off