Мне нужны все значения столбца MAFN
, которые были добавлены в таблицу за последний час (: мм). Столбец ReturnDt
хранит время добавления в формате DateTime, например '2005-01-11 08:50:24.767'.
Я могу получить часы для ReturnDt
и получить текущий час (в двух отдельных запросах).
SELECT ReturnDt,
DATEPART(hour, ReturnDt) As
FROM [Sidney].[dbo].[LibraryTransactions]
И
SELECT GETDATE() 'Today', DATEPART(hh,GETDATE()) 'Hour Part'
Но этого недостаточно по понятным причинам.
Во-первых SELECT GETDATE()...
не работает как подзапрос.
Во-вторых, я не могу вычесть 1 час из результата запроса SELECT GETDATE()
.
В-третьих, даже если два вышеперечисленных как-то сработали, запросы сокращают время до часов и не учитывают дату.
Я использую SQL Server 2005.
Заранее спасибо!
Редактировать:
Ожидаемый результат: если я запустил запрос сегодня (18 марта 2022 г.) в 16:00, я должен получить только эти значения.
Интересно, рассматривали ли вы возможность использования функции DATEADD()
с единицей измерения минут или часов?
@Dale K DTEADD( )
работает в SQL Server (начиная с 2008 года). Я использую SQL Server 2005
В соответствии с руководством по вопросам, пожалуйста, не публикуйте изображения кода, данных, сообщений об ошибках и т. д. - скопируйте или введите текст в вопрос. Пожалуйста, зарезервируйте использование изображений для диаграмм или демонстрации ошибок рендеринга, вещей, которые невозможно точно описать с помощью текста.
Вау... ну, первым шагом должно быть обновление, потому что ваша версия полностью не поддерживается и уже довольно давно.
И я не думаю, что вы правы, я видел множество статей, в которых упоминается использование dateadd
с 2005 года. Вы уверены, что отсутствующая функция на самом деле является вашей ошибкой?
И ReturnDt
хранится как datetime
или varchar
?
WHERE ReturnDt >= dateadd(hour, -1, getdate());
будет казаться тем, что вы хотите.
Также GETDATE() 'Today'
должно быть GETDATE() AS [Today]
- одинарные кавычки не должны использоваться для псевдонимов столбцов, потому что они выглядят как строковые литералы и, они устарели в некоторых формах (см. эта почта для получения дополнительной информации).
Я повторю то, что сказал Дейл, я не уверен, почему вы думаете, что DATEADD()
был введен в SQL Server 2008. Вот ссылка из документации SQL Server 2005, и это даже не тогда, когда он был введен. Вы также можете найти его на странице 2267 версия Books Online 2000 г. (и в документах 6.5 или 7.0, если сможете их найти). Кроме того, вы можете просто попробовать. Или апгрейдить и не париться о древней истории.
Как насчет DateDiff()
where
DateDiff( hour, ReturnDT, getdate() ) > 1
Спасибо за комментарий. Нет, это не работает. На выходе нет никакой разницы, но, по крайней мере, это не дает ошибки
это работает, если я переворачиваю знак равенства. where DateDiff( hour, ReturnDT, getdate() ) < 1
Еще раз спасибо!!
Почему бы не перевернуть его, чтобы индекс на ReturnDT
(сейчас или в будущем) имел какую-то надежду на использование? WHERE ReturnDT >= DATEADD(HOUR, -1, GETDATE());
?
@AaronBertrand, не могу использовать DateAdd(), потому что они работают с SQL2005, и он недоступен, но да, тест на равенство свопов
@DRapp DATEADD() определенно был доступен в 2005 году.
@AaronBertrand, по-видимому, не согласно сообщению пользователя, поскольку он указал, что недоступен. Но кто я такой, чтобы говорить, что у них есть :)
@DRapp OP ошибается, что DATEADD()
было добавлено в SQL Server 2008; вот страница документации из SQL Server 2005, в котором перечислены его функции. Поэтому я думаю, что ОП может получить какую-то другую несвязанную ошибку.
@AaronBertrand, не моя проблема, и это не должно продолжаться, если мы спорим. У них было одно, у них есть разрешение, независимо от контекста. СДЕЛАНО.
Укажите минимальный воспроизводимый пример, включая образцы данных, желаемые результаты и вашу попытку. Также точные типы данных каждого столбца.