Anjum18 Ответов: 1

Преобразование даты и времени в 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&lt;T&gt;.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

1 Ответов

Рейтинг:
1

CHill60

Далее к комментарию OP выше... попробуйте заменить

set @xml= (select CAST((
selecT DBName as 'td', '',
FullBackup_date as 'td', '', 
LogBackupDate as 'td' 
FROM final_table where LogBackupDate < (convert (datetime, (dateadd(hour,-2,getdate())),121))
for xml path ('tr'),elements) as nvarchar(max) ) 
)
с
set @xml= (select CAST((
select DBName as 'td', '',
FORMAT(FullBackup_date, 'yyyyMMdd HHmmss') as 'td', '', 
FORMAT(LogBackupDate, 'yyyyMMdd HHmmss') as 'td' 
FROM final_table where LogBackupDate < dateadd(hour,-2,getdate())
for xml path ('tr'),elements) as nvarchar(max) ) 
) 
Пункты для Примечания - вы заявили, что используете datetime типа так что избавьтесь от преобразования а datetime К varchar в WHERE заявление

Если вам не нужна дата в этом конкретном формате, попробуйте использовать один из стандартных форматов - см. Этот список Формат даты SQL Server Cheatsheet | TablePlus[^]

Учитывая что это электронная почта для человека а не для системы ваши пользователи могут предпочесть что то вроде формата 113 например
SELECT CONVERT(VARCHAR(26), GETDATE(), 113)
отображается как
10 Apr 2019 15:21:50:670


Anjum18

Большое вам спасибо, Chill60! Это действительно сработало.

CHill60

Фантастический. Рад был помочь. Если вы отметите мое решение как "принятое", это будет сигналом для других участников, что проблема решена