2017-02-07 2 views
0

Ich frage mich, ob Sie mir helfen können! Ich habe die großen Antworten von oben und Google gesucht und leider konnte ich die Antwort auf mein Rätsel nicht finden!Convert SQL Zurückgegebenes Datum in DateTime Format

Im Wesentlichen führe ich einen SQL-Befehl aus PowerShell, um die letzte Wiederherstellung Datum Zeit abzurufen, aber es wird nicht auf eine Weise angezeigt, die ich nicht mit dem aktuellen Datum vergleichen kann, um zu sehen, ob die Wiederherstellung konsistent ist.

Das Skript läuft wie pro unten:

$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 

Jedoch gibt diese das Format als „7. Februar 2017 09.15.30“.

Ich würde viel lieber ein standardisiertes Format, z. dd/mm/yyyy, damit ich diesen Wert mit dem heutigen Datum vergleichen kann und wenn es ein Match ist, etwas tun.

Wenn Sie einen anderen Weg haben, den Vergleich zu machen, der von mir in Ordnung ist, muss ich nur etwas tun, wenn das zurückgegebene Datum das heutige Datum ist.

+1

Ist das wirklich der Code, den Sie ausführen? Da '$ dbrestoredate' zum ersten Mal in der 'Write-output'-Zeile erwähnt wird, bin ich zweifelhaft. Alles in allem wird ein SQL Server 'datetime' in eine .NET' DateTime'-Struktur ohne Eingriff und ohne * irgendeine * Formatierung übersetzt. Das Formatieren stellt nur einen hässlichen Kopf dar, wenn Sie diese Daten in * Strings * konvertieren. Vermeiden Sie die Konvertierung, vermeiden Sie die Probleme. –

+0

Entschuldigung, ich habe das Skript geändert, um mehr von dem zu zeigen, was ich zu tun versuche, und um euch zu helfen, meine Frage besser zu verstehen, habt auch vergessen "$ DBName = $ SqlCmd.ExecuteScalar()" zu ändern, es sollte $ dbrestoredate anstelle von $ dbname –

+0

sein Überprüfen Sie den Typ der zurückgegebenen Daten ('$ dbrestoredate.GetType(). FullName'). Wenn es "System.DateTime" ist, können Sie den Wert direkt mit anderen Daten vergleichen (z. B. den Rückgabewert von "Get-Date" oder "[DateTime] :: Now"). Sie möchten nur Daten formatieren, wenn Sie sie einem Benutzer präsentieren. Ich empfehle dringend * gegen * mit 'convert' hier. –

Antwort

1

könnten Sie convert verwenden:

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

Dies wird eine Zeichenfolge zurück, das Datum im gewünschten Format darstellt (dd/mm/yyyy)

Bitte beachten Sie, dass TOP x Verwendung ohne ORDER BY Verwendung ist nicht deterministisch, da die Die Reihenfolge der von der Abfrage zurückgegebenen Zeilen kann nicht garantiert werden, es sei denn, die Klausel order by wird verwendet.

+0

Vielen Dank! Ich könnte euch beide küssen! @McNets und Sohar danke für die schnelle Antwort! –

1

versuchen, es zu String Umwandlung

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

einen Blick auf CONVERT in MS Docs haben, wenn Sie Endformat ändern möchten.