簡體   English   中英

PowerShell SQL 不接受日期格式

[英]PowerShell date format not accepted in SQL

我遇到了一個奇怪的問題。 當服務器的Region and Language設置設置為English (United States)時,包含日期和時間的對象沒有問題。 但是,當我將其更改為我所在國家/地區的當地Dutch (Belgium)時,我的一些 PowerShell 腳本遇到了問題。

PowerShell 中是否有某個變量需要設置以解決此問題? 還是我必須一直默認服務器上的英文日期格式?

例如,我們使用 Don Jones 提供的SQL module來填充 SQL 數據庫。 此行在設置為荷蘭語時會生成錯誤,但在設置為英語時不會:

if ($properties[$property] -eq 'datetime2') { [datetime]$prop = $result.GetDateTime($result.GetOrdinal($property)) }

我檢索日期的唯一方法是Get-Date ,沒有任何特殊之處。 當設置為Dutch (Belgium)時,它會生成此錯誤:

Exception calling "ExecuteNonQuery" with "0" argument(s): "Conversion failed when converting date and/or time from char
acter string."

在為Excel表生成內容時,我遇到了同樣的問題。 它還抱怨日期時間格式。

對於將DateTime字段等信息導出到 SQL,默認語言設置為English (United States)

因此,當您的Region and Language設置與 SQL 的默認設置不同時,即: English (United States) <> Dutch (Belgium) ,您應該在代碼中使用以下格式以符合英語默認設置:

Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
$_.whenCreated.ToString('yyyy-MM-dd HH:mm:ss')

另一種解決方案是更改 SQL Express 2014 中輸入的默認語言:

  1. 右鍵單擊服務器實例和 select Properties > Advanced
  2. Default language更改為Dutch (或您使用的語言)
  3. Ok確認
  4. 仍在SQL Management Studio go 到Security > Logins (在 Databases 下方)
  5. 雙擊您的user name和下面的 select Dutch作為Default language
  6. 重新啟動SQL Management Studio ,你應該對 go 好了

結果:當您在 PowerShell 代碼中使用 CmdLet Get-Date時,它會在將數據傳輸到 SQL 時按設計工作。SQL 和 Windows 的系統語言仍然是英語,但使用的格式是荷蘭語。

我將它用於 SQL 服務器中的 Datetime2。

Function Get-Datetime2([datetime]$Date = $(Get-Date) ) {
    $DT = Get-Date -Date $Date
    [string]$DateTime2 =  $DT.Month.ToString() + '/'
    [string]$DateTime2 += $DT.Day.ToString() + '/'
    [string]$DateTime2 += $DT.Year.ToString() + ' '
    [string]$DateTime2 += $DT.TimeOfDay.ToString()
    return $DateTime2
}

Get-Datetime2

返回看起來像這樣的東西。

3/12/2018 03:04:34.7496659

如果您已經使用過 Don Jones 的模塊,您可能已經熟悉通過 *.types.ps1xml 的類型擴展...如果我沒記錯的話,他的模塊中也應該有一個。

添加以下類型聲明時,

  <Type>
    <Name>System.DateTime</Name>
    <Members>
      <ScriptMethod>
        <Name>ToString</Name>
        <Script>
          $(Get-Date $This -Format "yyyy-MM-dd HH:mm:ss")
        </Script>
      </ScriptMethod>
    </Members>
  </Type>

您基本上將 System.DateTime 的 ToString() 方法重寫為標准 SQL Server 安裝所需的格式。

通過這種方式,您可以確保每次加載 SQL 模塊日期時,它們的格式都是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM