Сравните даты в T-SQL, игнорируя часть времени

Во-первых, обратите внимание, что следующие фрагменты кода идентичны.

public void foo() {
    synchronized (this) {
        // do something thread-safe
    }
}

и:

public synchronized void foo() {
    // do something thread-safe
}

делают точно то же самое . Никакое предпочтение любого из них за исключением удобочитаемости кода и стиля.

при синхронизации методов или блоков кода важно знать , почему Вы делаете такую вещь, и , какой объект точно Вы блокируете, и для [1 116] что цель .

Также примечание, что существуют ситуации, в которых Вы захотите к клиентский, синхронизируются блоки кода, в которых монитор Вы просите (т.е. синхронизируемый объект) не обязательно this, как в этом примере:

Vector v = getSomeGlobalVector();
synchronized (v) {
    // some thread-safe operation on the vector
}

я предлагаю, чтобы Вы получили больше знания о параллельном программировании, оно будет служить Вам много, как только Вы знаете точно, что происходит негласно. Необходимо проверить Параллельное Программирование в Java, замечательной книге по предмету. Если Вы хотите быстрое погружение - в к предмету, проверяете Параллелизм Java Sun

61
задан Fiona - myaccessible.website 15 September 2009 в 15:42
поделиться

3 ответа

Самый разумный способ сделать это - убрать временную часть из значений datetime и сравнить результаты, а лучший способ отделить временную часть от datetime выглядит следующим образом:

cast(current_timestamp as date)    

Раньше я использовал и защищал процесс, который выглядел как одна из следующих двух строк:

cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))

Но теперь, когда Sql Server имеет тип Date , который не содержит компонент времени, мало причина использовать любой из этих методов.

Еще одна вещь, о которой следует помнить, это то, что это все равно приведет к задержке запроса, если вам нужно сделать это для двух значений datetime для каждой строки в предложении where или условии соединения. Если возможно, вы хотите как-то разложить это на множители, чтобы они были максимально вычислены заранее, например, с использованием представления или вычисляемого столбца.

Наконец, обратите внимание, что функция DATEDIFF сравнивает количество пересеченных границ. Это означает, что разница в днях между '2009-09-14 11:59:59' и '2009-09-15 00:00:01' равна 1, хотя только Прошло 2 секунды, но РАЗНДАТ в днях между '2009-09-15 00:00:01' и '2009-09-15 11:59:59' все еще ноль, хотя прошло 86 398 секунд. На самом деле его вообще не волнует временной отрезок, а только границы. В зависимости от того, что пытается сделать ваш запрос, вы можете использовать это в своих интересах.

59:59 ' по-прежнему равно нулю, хотя прошло 86 398 секунд. На самом деле его вообще не волнует временной отрезок, а только границы. В зависимости от того, что пытается сделать ваш запрос, вы можете использовать это в своих интересах.

59:59 ' по-прежнему равно нулю, хотя прошло 86 398 секунд. На самом деле его вообще не волнует временной отрезок, а только границы. В зависимости от того, что пытается сделать ваш запрос, вы можете использовать это в своих интересах.

92
ответ дан 24 November 2019 в 17:09
поделиться

In my own work, when I wanted to determine that two dates were equal irrespective of time of day, I've used the following:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)

Granted, "comparison" includes much more than equality and the above converts the dates to U.S.A format MM/DD/YYYY prior to making the comparison. So, performance implications and inability to compare date differences.

But...it does work.

7
ответ дан 24 November 2019 в 17:09
поделиться

Если одно из ваших бизнес-требований не удовлетворяется вашей моделью данных (например, у вас есть требование сравнивать даты, но вы не отслеживаете даты, а только дату -plus-times), обратите внимание на возможность настройки модели, а не на метод борьбы с ней.

Было бы возможно и полезно сохранить только дату в индексированном вычисляемом столбце или сохранить дату и временные части отдельно?

4
ответ дан 24 November 2019 в 17:09
поделиться
Другие вопросы по тегам:

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