Проблемы Даты и времени SQL Server. Американец по сравнению с британцами?

Это как раз то, что я придумал, чтобы решить проблему ... Я почти уверен, что это решает проблему, с которой столкнулся оригинальный аскер:

Array.prototype.each = function(callback){
    if(!callback) return false;
    for(var i=0; i<this.length; i++){
        if(callback(this[i], i) == false) break;
    }
};

И тогда вы бы назвали это, используя :

var myarray = [1,2,3];
myarray.each(function(item, index){
    // do something with the item
    // if(item != somecondition) return false; 
});

Возвращение false внутри функции обратного вызова приведет к прерыванию. Дайте мне знать, если это не сработает.

11
задан Cade Roux 28 July 2009 в 00:40
поделиться

6 ответов

Вы можете использовать SET LANGUAGE , чтобы выбрать формат даты, который SQL Server ожидает в запросах (я думаю, что студия управления использует региональные настройки клиентского компьютера для отображения цели, хотя не уверен). Однако я предлагаю передавать значения с использованием параметров вместо того, чтобы встраивать их в оператор запроса. Если вы используете параметры, у вас не возникнет никаких проблем. Обо всем позаботились.

set language us_english
declare @d datetime = '1929/12/18'

set language british
declare @d datetime = '1929/12/18' -- fails

Чтобы изменить язык сервера по умолчанию:

declare @langid int = (select langid from syslanguages where name = 'british')
exec sp_configure 'default language', @langid
reconfigure with override
12
ответ дан 3 December 2019 в 04:33
поделиться

Поскольку перечисления являются целыми числами, вы можете заключить перечисление в NSNumber. Когда вы добавляете / получаете что-то на / с карты, вы передаете перечисление в конструктор NSNumber ...

Предполагая, что вы '

[Изменить: я просто говорю о том, что я вложил в свои сценарии SQL для обеспечения совместимости независимо от настроек сервера, а не о том, что SQL Server «отображает»]

4
ответ дан 3 December 2019 в 04:33
поделиться

Прежде всего, давайте обсудим, что такое «прямая ссылка» и почему она плохая. Прямая ссылка - это ссылка на переменную, которая еще не была инициализирована, и она не ограничивается только статическими инициализаторами. Это плохо просто потому, что, если они позволят, они дадут нам неожиданные результаты. Взгляните на этот фрагмент кода:

public class ForwardRef {
    int a = b; // <--- Illegal forward reference
    int b = 10;
}

Что должно быть j при инициализации этого класса? Когда класс инициализируется, инициализации выполняются в порядке от первого до последнего встреченного. Следовательно, вы ожидаете, что строка

a = b; 

будет выполняться до:

b = 10; 

Чтобы избежать такого рода проблем, разработчики Java полностью запретили такое использование прямых ссылок.

РЕДАКТИРОВАТЬ

это поведение определяется разделом 8.3.2.3 Спецификаций языка Java :

2
ответ дан 3 December 2019 в 04:33
поделиться

Вы можете установить значение по умолчанию язык для каждого отдельного входа в SQL Server . Не могу вспомнить, но что-то вроде этого:

sp_defaultlanguage @loginame = 'LoginName', @language = 'Language'
3
ответ дан 3 December 2019 в 04:33
поделиться

Почти во всех случаях правильный способ решить эту проблему - просто никогда не рассматривать дату как строку. Если вы передаете параметр или используете (типизированное) значение столбца, то преобразование текста сервера просто не имеет значения. Это не только позволяет избежать проблемы с i18n, но и снижает поверхность для атаки путем инъекции. И это также экономит несколько циклов ЦП ;-p

Если вы используете EXEC для динамического SQL, то это также следует параметризовать с помощью sp_ExecuteSQL .

1
ответ дан 3 December 2019 в 04:33
поделиться

Я стараюсь использовать каноническую форму ODBC для даты везде, где это возможно {д 'гггг-мм-дд'} Таким образом, я знаю, как sql server будет интерпретировать это. Он отлично работает в TSQL.

1
ответ дан 3 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: