2016-11-11 5 views
0

Какой будет лучший скрипт для получения записей из определенной таблицы с столбцом createdDate и modifiedDate, где modifiedDate - единственный столбец с нулевым значением и равен текущей дате/текущей дате?Выберите записи на основе двух столбцов даты

В случае, если будут значения null из измененного столбца даты, сценарий получит созданную дату.

Выход должен содержать все записи с последними созданными или измененными данными. Я попробовал этот сценарий ниже:

SELECT * 
FROM table 
WHERE ISNULL(CONVERT(date, ModifiedDate), 
      CONVERT(date,CreatedDate)) = CONVERT(date, getdate()) 

или

SELECT * 
FROM table 
WHERE CASE WHEN ModifiedDate IS NULL 
      THEN CONVERT(date, CreatedDate) 
      ELSE CONVERT(date,ModifiedDate) END = CONVERT(date, getdate()) 
+1

'convert (date, ModifiedDate)' ... Мне это не нравится, потому что это означает, что вы храните информацию о дате в неидентичном типе. –

+0

Мне нужно получить записи с той же датой, я использовал Convert (date, datetime), чтобы удалить Time, я также попробовал бросить (ModifiedDate в качестве даты), мне нужно получить записи самым быстрым способом. – jankenshin2004

+0

Что не так с этим, что вы пробовали? –

ответ

1

Если вам просто нужно это против сегодня (= GETDATE()), это должно быть просто:

SELECT * 
FROM tbl 
WHERE CAST(CreatedDate AS DATE) = CAST(GETDATE() AS DATE) 
    OR (ModifiedDate IS NOT NULL AND CAST(ModifiedDate AS DATE)= CAST(GETDATE() AS DATE)); 

Некоторые мысли: очень плохо использовать функции (здесь: ISNULL()) в predicats. Двигатель не сможет применять существующие индексы. Читайте перевод информации о sargable. Единственное исключение - CAST(SomeDateTime AS DATE), которое является приемлемым.

Если вам это не нужно для любой даты (только на сегодня), должно быть достаточно, чтобы сказать: Эта строка была создана сегодня, или сегодня это изменение было изменено.

Важно Убедитесь, что имеются индексы для ModifiedDate и CreatedDate!

+0

Привет @Shnugo, ИЛИ повлияет на производительность, я думаю, и да есть индексы для этих 2 столбцов – jankenshin2004

+0

@ jankenshin2004 Почему вы так думаете? Простая логическая логика (AND/OR ...) является самой быстрой. Если в обоих столбцах есть индекс, проверка на равенство должна быть молниеносной, даже с миллионами строк ... – Shnugo

+0

Основываясь на данных, которые я испытываю прямо сейчас, когда я использую OR по сравнению с сценарием выше, я опубликовал, выполнение время слишком велико и отличается. – jankenshin2004

0

Это то, что вы ищете?

SELECT 
    someColumn1, 
    someColumn2, 
    CASE 
     WHEN modifiedDate IS NULL THEN createdDate 
     ELSE modifiedDate 
    END AS someDate 
FROM someTable 
+0

Я думаю, нет, потому что он получит все записи. В приведенном выше скрипте нет фильтра. Если я его использую, он вернет миллионы записей. Мне просто нужны записи на сегодня – jankenshin2004

+0

Не могли бы вы предоставить нам некоторые примеры данных? – dhaninugraha

0

Вы можете использовать функцию ISNULL() в TSQL

SELECT * FROM таблицы WHERE ISNULL (CONVERT (дата, ModifiedDate), CONVERT (дата, CreatedDate)) = CONVERT (дата, GETDATE())

+0

Прочтите существующие ответы ... Использование 'ISNULL()' в предложении WHERE' не * sargable *. Двигатель не сможет применять индексы. Этого следует избегать ... – Shnugo

+0

Спасибо за информацию. Как работает функция COALESCE()? будет ли он также нарушать использование индексов? –

+0

Да, почти любая функция будет ослепить оптимизатора. Существует несколько исключений, таких как 'CAST (SomeDateTime AS DATE)', но в большинстве случаев функция приведет к выполнению * строки за строкой * ... – Shnugo

0

Если функция использования повлияет на индексы, попробуйте воспользоваться этой функцией, если она эффективна.

SELECT * 
FROM table 
WHERE ModifiedDate IS NOT NULL 
AND CONVERT(date,ModifiedDate) = CONVERT(date, getdate() 
UNION 
SELECT * 
FROM table 
WHERE ModifiedDate IS NULL 
AND CONVERT(date,CreatedDate) = CONVERT(date, getdate() 
Смежные вопросы