Извлечь подстроку из строки в таблице SQL и преобразовать в дату - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь извлечь одну строку данных из SQL серверной таблицы через PowerShell и преобразовать извлеченное значение в дату.

Первые 8 символов строки должны быть в формате yyyymmdd .

Во-первых, у меня возникают проблемы с извлечением строки ...

Что касается различных постов, которые я видел, кажется, что когда вы захватываете строку, возвращается тип данных System.Data.DataRow. Затем вам нужно преобразовать его в Array. Как я могу получить значения из массива / datarow? В идеале я хотел бы, чтобы значение возвращалось как String - так как будет возвращено только одно значение. В настоящее время я использую что-то вроде этого - но содержимое null (хотя оператор в SSMS возвращает одну строку) ...

[array]$lastSQLdateArray = Invoke-Sqlcmd -ServerInstance INSTANCE -Database DATABASE -Query "SELECT TOP 1 LEFT(Column, 8) FROM [dbo].[Table] ORDER BY ID DESC"

for ($i=0; $i -le $lastSQLdateArray.Length; $i++)
{
  $formatOut = $formatOut + ($lastSQLdateArray[$i].ItemArray -join ",")
}

Тогда есть вопрос преобразования извлеченного значения yyyymmdd (какого бы типа он ни был) и преобразования его в date.

Как мне это сделать, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Спасибо за вашу помощь. С вашей помощью мне удалось разобрать проблему, используя следующий синтаксис:

$strSQL = 'SELECT TOP 1 LEFT(Colname, 8) AS Col FROM [dbo].[Table] ORDER BY ID DESC'

$lastSQLdateArray1 = Invoke-Sqlcmd -ServerInstance 'server' -Database 'database' -Query $strSQL

$newvar = [datetime]::ParseExact($lastSQLdateArray1.Col.ToString(),'yyyyMMdd',$null)

$newvar

Единственное основное отличие заключается в том, что я поместил .ToString () в строку преобразования даты.

Спасибо один раз снова за вашу помощь. Очень ценится!

0 голосов
/ 18 февраля 2020

Добро пожаловать, warnerj79. Прежде всего, ваше утверждение SQL немного двусмысленно. Я бы рекомендовал всегда указывать AS ColumnName при расчете параметров. Это поможет позже. Мне также нравится помещать мой SQL в переменную для удобства чтения. Таким образом, ваша строка SQL становится:

$strSQL = "SELECT TOP 1 LEFT(Column, 8) AS 'DateTimeString' FROM [dbo].[Table] ORDER BY ID DESC"
[array]$lastSQLdateArray = Invoke-Sqlcmd -ServerInstance INSTANCE -Database DATABASE -Query $strSQL

Тогда ваша переменная результатов ([array]$lastSQLdateArray) будет содержать одну строку (из-за использования TOP 1, поэтому вы получите доступ к свойству YYYYMMDD как это:

$lastSQLdateArray[0].DateTimeString

Или, так как это только один элемент в массиве, это будет работать также:

$lastSQLdateArray.DateTimeString

Это значение в строковом формате. Чтобы преобразовать это к переменной [datetime] я бы использовал метод parseexact следующим образом:

$DateTimeVariable = [datetime]::ParseExact($lastSQLdateArray[0].DateTimeString,'yyyyMMdd',$null)

РЕДАКТИРОВАТЬ: добавлены следующие тестовые данные:

Я создал тестовую таблицу в моем SQL сервер с именем "m_test1" со следующими данными:

столбец идентификатора

1 20200218junk

Я использовал эти операторы:

$strSQL = 'SELECT TOP 1 LEFT([Column],8) as COL FROM [TEST].[dbo].[m_test1] ORDER BY ID'
$lastSQLDateArray = Invoke-Sqlcmd -ServerInstance 'servername' -Database 'TEST' -Query $strSQL

И я получил следующее:

PS C:> $returnvalue

COL     
---
20200218

PS C:> $returnvalue.COL
20200218

PS C:> [datetime]::ParseExact($returnvalue.COL,'yyyyMMdd',$null)

Tuesday, February 18, 2020 12:00:00 AM

Надеюсь, это поможет! Если это произойдет, пожалуйста, не забудьте принять ответ с помощью галочки слева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...