2009-12-01 2 views
1

Есть ли способ, чтобы написать эквивалент запроса кSql Shorthand Для Даты

select * from log_table where dt >= 'nov-27-2009' and dt < 'nov-28-2009'; 

но где можно указать только 1 дату и сказать, что вы хотите, чтобы результаты этого весь день до следующего.

Я просто придумываю, но что-то в виде:

select * from log_table where dt = 'nov-27-2009':+1; 
+2

Какой поставщик базы данных? –

ответ

2

Я не верю, что существует один метод, который переносится на все РСУБД.

Проверка в одной из моих ссылок (SQL Cookbook) показывает, что ни одна RDBMS не решает проблему совершенно так же. Я бы рекомендовал проверить главу 8 этой книги, которая охватывает все различные методы для DB2, Oracle, PostgreSQL, MySQL.

Я имел дело с этим вопросом в SQLite, хотя и SQL Cookbook не решает, что РСУБД, поэтому я упомяну немного об этом здесь. У SQLite нет даты и времени Тип данных; вы должны создать свой собственный, сохранив все данные даты и времени как TEXT и убедитесь, что ваше приложение применяет его форматирование. SQLite имеет набор date/time conversion functions, который позволяет добавлять номинальную дату/время, сохраняя данные в виде строк. Если вам нужно добавить две длительности (HH: MM: SS) друг к другу, однако, основываясь на данных, которые вы сохранили в текстовых столбцах, которые вы обрабатываете как данные даты и времени, вам нужно будет write your own functions (поиск для «Определение пользовательских функций SQLite») и прикреплять их к базе данных во время выполнения по вызову sqlite3_create_function(). Если вам нужен пример некоторых пользовательских функций, которые добавляют значения времени, дайте мне знать.

0

Для MS SQL Server, проверьте DATEPART.

/* dy = Day of Year */ 
select * from log_table where datepart(dy, dt) = datepart(dy, '2009-nov-27'); 
+1

Это относится к SQL Server. Большинство других баз данных имеют эквивалентные функции для работы с датами. –

+1

И выполнение функции в столбце базы данных обычно ограничивает оптимизатор запросов от использования любого индекса в этом столбце.(Оптимизаторы всегда становятся умнее, так что это может измениться. Oracle позволяет определять индексы на основе фунции, чтобы справиться с этим.) –

0

С SQL Server, вы можете

Select * From table 
    Where dt >= DateAdd(day, DateDiff(day, 0, @ParamDate), 0) 
     And dt < DateAdd(day, DateDiff(day, 0, @ParamDate), 1) 
0

До тех пор, как вы имеете дело с типом данных даты для соответствующего типа данных, следующие будут работать:

t.date_column + 1 

... будет добавьте один день к указанной дате. Но я еще не нашел db, который допускает неявное преобразование типа данных в дату.

SELECT '12-10-2009' + 1 

... потерпит неудачу на SQL Server, так как SQL Server выполняет только неявное преобразование при сравнении с колонки даты и времени типа данных. Таким образом, вы должны использовать:

SELECT CONVERT(DATETIME, '12-10-2009') + 1 

Для Oracle, вы должны использовать функцию TO_DATE; MySQL будет использовать что-то вроде STR_TO_DATE и т. Д.

0

Есть столбец, который имеет только дату (время 00: 00: 00.000), а затем вы можете добавить предложение where: WHERE dt = '2009-11-27'