Sql server 从SQL表中的行提取子字符串并转换为日期

Sql server 从SQL表中的行提取子字符串并转换为日期,sql-server,powershell,Sql Server,Powershell,我试图通过PowerShell从SQL Server表中提取一行数据,并将提取的值转换为日期 字符串的前8个字符应为yyyyymmdd格式 首先,我提取行时遇到问题 根据我看到的各种帖子,当您获取一行时,返回的数据类型似乎是System.data.DataRow。然后需要将其转换为数组。如何从数组/数据行获取值?理想情况下,我希望该值作为字符串返回,因为只返回一个值。 我目前正在使用类似的东西-但是内容是null(即使SSMS中的语句返回一行) [array]$lastSQLdateArray=

我试图通过PowerShell从SQL Server表中提取一行数据,并将提取的值转换为日期

字符串的前8个字符应为
yyyyymmdd
格式

首先,我提取行时遇到问题

根据我看到的各种帖子,当您获取一行时,返回的数据类型似乎是
System.data.DataRow
。然后需要将其转换为
数组
。如何从数组/数据行获取值?理想情况下,我希望该值作为
字符串返回,因为只返回一个值。
我目前正在使用类似的东西-但是内容是
null
(即使SSMS中的语句返回一行)

[array]$lastSQLdateArray=Invoke Sqlcmd-ServerInstance-Database-Query“从[dbo].[Table]按ID顺序描述中选择左上1(第8列)”

然后是转换提取的
yyyymmdd
值(它是哪种数据类型)并将其转换为
date
的问题


我该怎么做呢?

欢迎光临,华纳J79。首先,您的SQL语句有点模棱两可。我建议在计算参数时始终将
指定为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 server中创建了一个名为“m_test1”的测试表,其中包含以下数据:

ID列

12000218垃圾

我使用了以下语句:

$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

希望这有帮助!如果有帮助,请不要忘记使用左边的复选标记接受答案。

欢迎,warnerj79。首先,您的SQL语句有点含糊不清。我建议在计算参数时始终将
指定为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 server中创建了一个名为“m_test1”的测试表,其中包含以下数据:

ID列

12000218垃圾

我使用了以下语句:

$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

希望这有帮助!如果有,请不要忘记使用左边的复选标记接受答案。

谢谢您的帮助。 在您的帮助下,我已成功使用以下语法对问题进行排序:

$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()


再次感谢您的帮助。非常感谢!

谢谢您的帮助。 在您的帮助下,我已成功使用以下语法对问题进行排序:

$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()


再次感谢您的帮助。非常感谢!

第一个问题,为什么您首先要将日期存储为字符串?似乎您可以通过修复原始表的数据类型来帮助自己。正确的数据类型对于设计数据库至关重要。@SeanLange非常好。我下面的回答将用于转换数据类型ata,但从一开始就不必转换要好得多。您好。这些是我正在处理的文件名,而不是每个文件的日期。表中已有日期列,与这些文件名无关。您可以添加一个日期计算列,然后将文件名的日期部分分开。@SeanLange Fair重点-但我更愿意找到一个解决方案。此外,我相信这不会是我唯一一次遇到这样的问题,所以解决这个问题将是有益的。第一个问题,为什么要首先将日期存储为字符串?看来,通过修复原始表的数据类型,您会有很大帮助。正确的数据类型e在设计数据库时非常重要。@SeanLange非常好。我下面的答案可以用来转换数据,但最好一开始就不必转换。您好。这些是我正在处理的文件名,不是每个字符的日期。表中已经有日期列,它们与这些文件名无关。您可以添加如果一个计算列是日期,那么您就可以将文件名的日期部分分隔开来。@SeanLange Fair point-但我宁愿按原样找到解决方案。此外,我相信这不会是我唯一一次遇到这种情况,所以解决这个问题将是有益的Hi Matthew。感谢您的快速回复!DateTimeString方法带来了返回空值-而不使用该方法返回列和值…(如预期)。这是正确的方法还是不太正确…?请参阅我在上面的编辑添加测试值。我不确定您在做什么,但我的测试显示我的解决方案能按预期工作。嗨,Matthew。感谢您的快速回复!DateTimeString方法返回空值,而不使用该方法则返回列和