Когда я выполняю функцию, которая возвращает дату и время (например, GETDATE()
) в SQL Server Management Studio, вывод форматируется в «культуре» пользователя (настройки региона/языка). Однако, когда тот же запрос выполняется в Powershell с помощью командлета Invoke-Sqlcmd
, выходные данные форматируются в формате даты США (который, как я полагаю, является инвариантной культурой). Другие командлеты, такие как Get-Date
, возвращают дату и время в CurrentCulture.
Как я могу гарантировать, что выходные данные Invoke-Sqlcmd
соответствуют настройкам CurrentCulture?
Минимальный пример кода для демонстрации
$result = Invoke-Sqlcmd -query "select GETDATE() as datetime" -ServerInstance ...
$now = Get-date -format "yyyy-MM-dd HH:mm:ss"
if ( $result.datetime -eq $now) {
Write-output "ok"
} else {
Write-warning "dates mismatch '$($result.datetime)' should be '$now'"
}
Предупреждение показывает первую дату и время, отображаемую в формате США, и вторую дату и время в указанном формате.
GetDate()
не имеет формата нет — это просто строго типизированное двоичное значениеdatetime
. Возможно, вы конвертируете его в строку? Разместите свой сценарий - person Panagiotis Kanavos   schedule 31.01.2017INSERT INTO MyTable (MyCol) VALUES(GetDate())
, язык не имеет значения. Если вы пишете вместоEXEC 'INSERT ...' + GETDATE() + '..'
у вас ошибка. Ваш скрипт не сработает, если изменится локаль, и он будет уязвим для множества других проблем, включая SQL-инъекции. - person Panagiotis Kanavos   schedule 31.01.2017GETDATE()
) возвращает объект System.DateTime. Форматирование происходит в вызове Write-Warning, который отображает результат и ожидаемое значение (которое передается функции в виде строки). Если вы опубликуете свой первый комментарий в качестве ответа, я приму его. - person Bram   schedule 31.01.2017