Предложение OR группировки с помощью DATEDIFFS в SQL - PullRequest
1 голос
/ 19 августа 2011

У меня есть таблица sql.Мы назовем это «стол».Я пытаюсь сделать выбор с несколькими предложениями WHERE.Мне нужно, чтобы последнее предложение where было OR.Обычно я просто делаю это:

SELECT *
FROM table
WHERE 1=1
AND (firstName='tom' OR lastName='jones')

Однако в этом конкретном запросе мне нужно, чтобы две стороны OR были DATEDIFFS.Я пытаюсь захватить все строки, где разница между отметкой времени и «СЕЙЧАС» превышает 10 часов или меньше 0 часов.Итак, что у меня сейчас, какие ошибки, это:

SELECT *
FROM table
WHERE 1=1
AND (
      DATEDIFF(hh, table.timestamp, GETDATE()) > 10
    OR
      DATEDIFF(hh, table.timestamp, GETDATE()) < 0
    )

Я пробовал несколько разных версий того, что у меня есть выше, и, похоже, ничего не работает.Любая помощь приветствуется!Я уверен, что только что слишком долго смотрел на это, и это что-то глупое.

Новый более подробный запрос:

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

SELECT
  tblCheckoutActivity.rid,  
  tblCheckoutActivity.checkedOutUser,
  tblCheckoutActivity.checkedOutTime,
  tblCheckoutInventory.serial,
  tblCheckoutInventory.unit,
  tblCheckoutInventory.tag,
  tblCheckoutUsers.firstName,
  tblCheckoutUsers.lastName
FROM
  tblCheckoutActivity
LEFT JOIN
  tblCheckoutInventory
ON 
  tblCheckoutActivity.scannerID = tblCheckoutInventory.SID
LEFT JOIN
  tblCheckoutUsers
ON
  tblCheckoutActivity.checkedOutUser = tblCheckoutUsers.badgeID
WHERE
  tblCheckoutActivity.checkedInTime Is Null 
AND 
  tblCheckoutInventory.site='San Francisco'
AND
  (
    DATEDIFF(hh, tblCheckoutActivity.checkedOutTime, GETDATE()) > 10
  OR
    DATEDIFF(hh, tblChecckoutActivity.checkedOutTime, GETDATE()) < 0
  )
ORDER BY tblCheckoutUsers.lastName 

Ответы [ 3 ]

0 голосов
/ 19 августа 2011

Я думаю, что ваша проблема где-то еще. Я просто запустил это без ошибок:

with temp as
(
select 1 as id,        CAST('10/31/2011' as DATETIME) as timestamp
UNION
SELECT 2,        CAST('11/1/2011' as DATETIME)
UNION
SELECT 3,        CAST('11/2/2011' as DATETIME)
UNION
SELECT 4,        CAST('11/3/2011' as DATETIME)
UNION
SELECT 5,        CAST('11/6/2011' as DATETIME)
UNION
SELECT 6,        CAST('11/8/2011' as DATETIME)
)

SELECT *
FROM temp
WHERE 1=1
AND (
      DATEDIFF(hh, timestamp, GETDATE()) > 10
    OR
      DATEDIFF(hh, timestamp, GETDATE()) < 0
    )

Показываете ли вы сокращенную версию вашего запроса? Есть ли код перед этим запросом, который отсутствует в вашем примере?

0 голосов
/ 23 августа 2011

Если вы используете тип данных timestamp, то это ваша проблема.Вы не можете выполнить сравнение DATEDIFF между DATETIME и отметкой времени.

0 голосов
/ 19 августа 2011
SELECT *
FROM table
WHERE 
      DATEDIFF(hh, table.timestamp, GETDATE()) > 10
UNION
SELECT *
FROM table
WHERE 
      DATEDIFF(hh, table.timestamp, GETDATE()) < 0

быстро и грязно, но должно работать

...