SQL (Teradata) Выбор данных
У меня есть вопросы, связанные с SQL (teradata в частности). Я должен сформировать отчет за 1 день.
Как мне этого добиться?
Например, в MS Access я могу сделать
WHERE DT>=#2011-01-01# and DT<=#2011-0101#
А как насчет больших парней? (SQL Server, а не MS Access).
Я знаю что можно использовать
DT between '2011-09-01' and '2011-09-02'
Но этот метод не является точным. Как я могу указать 1 день, используя оператор WHERE?
Я извиняюсь, у меня нет доступа к SQL, и я не могу проверить его; поэтому я прошу профессионального совета.
4 ответа
BETWEEN
с учетом диапазона, так что это будет делать:
DT between '2011-09-01' and '2011-09-01'
И да, это точно:)
Теперь, если ваш DT
это поле даты и времени (не поле даты), то вы должны изменить свой подход:
DT >= '2011-09-01' and DT < '2011-09-02'
Работа с датами в Teradata может быть немного сложнее.
Если DT - это поле "отметка времени", вы можете просто преобразовать его в дату и, поскольку вы отчитываетесь ровно за один день, просто проверить на равенство.
Допустим, вы хотите сообщить о сегодняшнем дне, поэтому перейдите к '03 / 20/2012 ':
-- Teradata: Select records where DT matches a certain day.
SELECT * -- etc...
WHERE CAST(DT as date) = TO_DATE('03/20/2012', 'mm/dd/yyyy')
MS SQL похож:
SELECT * from [webdb].[mediaguide].[fileDirectories]
WHERE CAST('03/20/2012' AS date) = CAST(DT AS date)
Технически я бы использовал параметризацию для передачи даты, но вы поняли идею.
При выборе диапазона (особенно даты и метки времени) лучше всего делать нижнюю границу включительно, верхнюю границу исключая. То есть вы хотите вещи в ассортименте lb <= x < ub
, В вашем случае это составляет:
SELECT [list of columns]
FROM [table]
WHERE dt >= :startDate
AND dt < :endDate
(:variableName
так я могу ввести переменные хоста в моей системе. Вам придется посмотреть, что это на терадате.)
Строки, которые вы перечислили между, будут работать как есть - я думаю, что почти все основные СУБД распознают * форматирование ISO по умолчанию.
Простой ответ будет:
WHERE DT BETWEEN Date_X AND Date_X + 1
Если вы хотите быть явно
WHERE DT BETWEEN Date_X AND Date_X + INTERVAL '1' DAY
Вы всегда можете прочитать Руководство Teradata:)
Следуя их руководству, x МЕЖДУ y AND z == ((x> = y) AND (x <= z))