2017-02-07 6 views
0

Интересно, можете ли вы мне помочь! Я искал отличные ответы выше и Google и, увы, мне не удалось найти ответ на мою загадку!Преобразование SQL Возвращаемая дата в формат DateTime

По существу, я запускаю команду SQL из PowerShell, чтобы получить последнее время восстановления, но оно не отображается таким образом, чтобы я (я думаю) не мог сравниться с текущей датой, чтобы убедиться, что восстановление согласовано.

Скрипт работает как в ниже:

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=SERVER\Instance;Database=DataBaseName;Integrated Security=True" 
$SqlConnection.Open() 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = "DECLARE @DB sysname = 'DataBaseName'; 
SELECT TOP 1 restore_date 
FROM msdb.dbo.restorehistory 
WHERE destination_database_name = @DB 
ORDER BY restore_date DESC;" 
$SqlCmd.Connection = $SqlConnection 
$dbrestoredate = $SqlCmd.ExecuteScalar() 
$SqlConnection.Close() 
Write-Output "Database Restore date " $dbrestoredate 

Однако это возвращает формат как «07 февраля 2017 9:15:30».

Я бы предпочел, чтобы это был стандартизованный формат, например. dd/mm/yyyy, чтобы я мог сравнить это значение с сегодняшней датой и если это что-то сделать.

Если у вас есть другой способ сделать сравнение, это нормально, мне просто нужно что-то сделать, если дата вернулась - сегодняшняя дата.

+1

Действительно ли это код, на котором вы работаете? Потому что на данный момент '$ dbrestoredate' впервые упоминается в строке« Write-output », поэтому я сомневаюсь. Все хорошо, SQL-сервер 'datetime' будет переведен в структуру .NET' DateTime' без вмешательства и без * любого * форматирования. При форматировании только уродливая голова, если вы преобразовываете эти данные в * строки *. Избегайте конверсии, избегайте проблем. –

+0

Извините, я изменил сценарий, чтобы показать больше того, что я пытаюсь сделать, и помочь вам, ребята, лучше понять мой вопрос, также забыл изменить «$ DBName = $ SqlCmd.ExecuteScalar()», он должен быть $ dbrestoredate вместо $ dbname –

+0

Проверьте тип возвращаемых данных ('$ dbrestoredate.GetType(). FullName'). Если это 'System.DateTime', вы можете сравнить значение напрямую с другими датами (например, возвращаемое значение' Get-Date' или '[DateTime] :: Now'). Вы хотите только форматировать даты, когда вы представляете их пользователю. Я настоятельно рекомендую * против * использовать 'convert' здесь. –

ответ

1

Вы можете использовать convert:

select TOP 1 CONVERT(char(10), restore_date, 103) from msdb.dbo.restorehistory 

Это возвращает строку, представляющую дату в требуемом формате (dd/mm/yyyy)

Пожалуйста, обратите внимание, что при использовании TOP x без использования ORDER BY недетерминированно, так как порядок строк, возвращаемых запросом, не может быть гарантирован, если не используется предложение order by.

+0

Большое вам спасибо! я мог бы поцеловать вас обоих! @McNets и Zohar за быстрый ответ! –

1

попытаться преобразовать его в строку

select TOP 1 convert(varchar(20), restore_date, 103) as restore_date 

Посмотрите CONVERT в MS Docs, если вы хотите изменить окончательный формат.

Смежные вопросы