Powershell将过滤器应用于日期小时分钟过滤器

时间:2020-10-01 15:01:22

标签: powershell

以下命令运行正常,并使用Powershell给出结果

Invoke-DbaWhoIsActive -SqlInstance prod  | Select-object 'dd hh:mm:ss.mss',  login_name, wait_info, host_name, sql_text

dd hh:mm:ss.mss : 00 02:36:54.540
login_name      : sa
wait_info       : 
host_name       : Prod
sql_text        : <?query --
                  begin tran
                  --?>

如何将过滤器应用于dd hh:mm:ss.mss-仅显示大于15分钟的结果。

3 个答案:

答案 0 :(得分:2)

您可以将dd hh:mm:ss.mss属性值解析为[timespan] (System.TimeSpan)实例,然后可以(通过Where-Object cmdlet筛选其.TotalMinutes属性:

Invoke-DbaWhoIsActive -SqlInstance prod | Where-Object { 
  ([timespan] ($_.'dd hh:mm:ss.mss' -replace ' ', '.')).TotalMinutes -gt 15  
} | Select-Object 'dd hh:mm:ss.mss',  login_name, wait_info, host_name, sql_text

以上内容用句点(00 02:36:54.540)替换了诸如.之类的字符串中的空格,这导致您可以将字符串直接转换为[timespan]

答案 1 :(得分:0)

尝试一下:

Invoke-DbaWhoIsActive -SqlInstance prod  | Select-object @{n='dd hh:mm:ss.mss';e={if(($_.'dd hh:mm:ss.mss'.tostring().split(" ")[1]).split(":")[0])-gt15){$_.'dd hh:mm:ss.mss'}}},login_name, wait_info, host_name, sql_text

答案 2 :(得分:0)

列标题的名字真可怕。也就是说,这应该可以实现您的目标。

Invoke-DbaWhoIsActive -SqlInstance prod |
    Where-Object {($_.'dd hh:mm:ss.mss' -split ':')[1] -gt 15} |
        Select-object 'dd hh:mm:ss.mss',  login_name, wait_info, host_name, sql_text

只需在冒号'dd hh:mm:ss.mss'处拆分属性:,抓住第二个元素[1],如果它大于15,它将被传递到您的select-object语句。

这里有一个可以运行的小测试

$var = @'
dd hh:mm:ss.mss
00 02:36:54.540
00 02:12:54.540
00 02:44:54.540
00 02:15:54.540
'@ | convertfrom-csv

$var | Where-Object {($_.'dd hh:mm:ss.mss' -split ':')[1] -gt 15}