【问题标题】:Convert date format to CSV export将日期格式转换为 CSV 导出
【发布时间】:2020-08-30 08:55:25
【问题描述】:

我是 Poweshell 的新手,我编写了一个脚本,将 SQL 选择的结果导出到 csv。但是,我有两列的日期格式为 mm-dd-yyyy,我希望它的格式为 yyyy-MM-dd HH:mm:ss.fff。我只能转换一列,而在另一列中我找不到转换方法。

有人可以帮我转换两列吗?

#Connect to SQL and run QUERY 
$SQLServer = "xxxx" 
$SQLDBName = "xxxx"
$SQLUsername = "xxxx"
$SQLPassword = "nxxx"

$OuputFile = "c:\SQL_Export.csv"

$SqlQuery = "SELECT  
    rtrim(HANDLE) as Handle,
    rtrim(EMPRESA) as Empresa,
    rtrim(FILIAL) as Filial,
    rtrim(OPERACAO) as Operacao,
    rtrim(PESSOA) as Pessoa,
    rtrim(dataemissao) as Dataemissao,
    rtrim(documentodigitado) as Documentodigitado,
    rtrim(dataultimaliq) as Dataultimaliq,
    rtrim(ehprevisao) as Ehprevisao,
    rtrim(status) as Status,
    rtrim(entradasaida) as Entradasaida
  FROM [$SQLDBName].[dbo].[FN_DOCUMENTOS]
  where DATAULTIMALIQ >= '20200101'
  ORDER BY handle ASC"

##Delete the output file if it already exists
If (Test-Path $OuputFile ){
    Remove-Item $OuputFile
}

Write-Host "INFO: Exporting data from $SQLDBName to $OuputFile" -foregroundcolor white -backgroundcolor blue

## - Connect to SQL Server using non-SMO class 'System.Data':
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; User ID = $SQLUsername; Password = $SQLPassword"

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd

$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 

#Output RESULTS to CSV
$DataSet.Tables[0] | select-Object -ExcludeProperty Dataemissao @{Name="Dataemissao";Expression={([datetime]$_.Dataemissao).ToString("yyyy-MM-dd HH:mm:ss.fff")}}, * | Export-Csv $OuputFile
(Get-Content $OuputFile) | Foreach-Object {$_ -replace '"', ""} | Set-Content $OuputFile -Encoding `UTF8`

我需要转换的列是“Dataemissao”和“Dataultimaliq”

【问题讨论】:

  • 请告诉我们另一个日期字段是什么以及它当前要转换的格式是什么样的。由于字段名称都是葡萄牙语(?)我看不懂..
  • 感谢您的帮助。是的,这些字段是葡萄牙语的。我需要转换以下字段:“Dataemissao”和“Dataultimaliq”
  • CSV文件中的日期格式如下:Feb 12 2020 12:00 AM,但是我想来02.12.2020 12:00:00.000
  • 在这一行select-Object -ExcludeProperty Dataemissao @ {Name = "Dataemissao"; Expression = {([datetime] $ _. Dataemissao) .ToString ("yyyy-MM-dd HH: mm: ss.fff")}} 我转换了字段“Dataemissao”但是,我尝试了一些方法来对字段“Dataultimaliq”做同样的事情,但没有成功。
  • 刚接触 SO 你可能不知道这一点,但习惯于点击左侧的 ✓ 图标 accept the answer that solved your problem。这将有助于其他有类似问题的人更轻松地找到它,并有助于激发人们回答您的问题。

标签: sql powershell csv


【解决方案1】:

在这种情况下,您需要在 Select-Object 中使用很长的一行:

$DataSet.Tables[0] | 
    Select-Object -ExcludeProperty Dataemissao, Dataultimaliq @{Name = "Dataemissao";   Expression= { '{0:yyyy-MM-dd HH:mm:ss.fff}'-f [datetime]$_.Dataemissao }},
                  @{Name = "Dataultimaliq"; Expression= { '{0:yyyy-MM-dd HH:mm:ss.fff}'-f [datetime]::ParseExact($_.Dataultimaliq, 'MMM dd yyyy hh:mm tt', [cultureinfo]"en-US") }},
                  * | Export-Csv -Path $OuputFile -Encoding UTF8 -NoTypeInformation

或者,您可以在代码上方添加一个小帮助函数,例如

function Format-Date () {
    param (
        [string]$dateString,
        [string]$format = 'MMM dd yyyy hh:mm tt'
    )
    $date = Get-Date
    if ([datetime]::TryParseExact($dateString, $format, [cultureinfo]"en-US", 0, [ref]$date)) {
        return '{0:yyyy-MM-dd HH:mm:ss.fff}'-f $date
    }
}

并将其用于Dataultimaliq:

@{Name = "Dataultimaliq"; Expression= { Format-Date $_.Dataultimaliq }},

如您所见,我在其中添加了第二个参数 $format,默认为 ''MMM dd yyyy hh:mm tt',因为这是返回的 Dataultimaliq 字段的格式。
您也可以在 Dataemissao 字段上使用它,但我不知道它是什么格式。(显然,您的系统可以将其转换为 DateTime 对象而不会出现任何问题)

我看到您稍后阅读了 csv 文件并从中删除了引号。这可能会导致各种问题,因为有时 CSV 文件中需要引号,您不应该简单地删除所有引号。查看this answer 的代码如何安全地做到这一点

附: '{0:yyyy-MM-dd HH:mm:ss.fff}'-f [datetime]$_.Dataemissao 是一种更“PowerShelly”以特定格式获取日期的方式。它返回与([datetime]$_.Dataemissao).ToString("yyyy-MM-dd HH:mm:ss.fff") 相同,但更简洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2018-02-12
    • 2011-08-02
    • 1970-01-01
    • 2014-07-20
    • 2016-12-02
    相关资源
    最近更新 更多