Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вычисление времени по разным полям  [new]
formfactor
Member

Откуда: Dnipro
Сообщений: 40
Доброго времени суток! Прошу вашей помощи.

Есть таблица, в которой дата разбита по полям:

|DD|MM|YYYY|
----------------------
| 17| 12| 2014|
| 12| 02| 2015|
| 07| 03| 2015|
| 22| 04| 2015|
... и т.д.

Как правильно составить sql-запрос, чтобы возможно было работать с такими полями, как с обычной датой? Предполагаю, что вопрос нубский, но сложные запросы на нем не умею :( Запиливается программуля на Delphi, в которой должна производиться выборка из таблицы по дате, используя компоненты работы с Датой/Временем (TDateTimePicker).
13 июл 15, 09:46    [17884240]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
Glory
Member

Откуда:
Сообщений: 104760
formfactor
Как правильно составить sql-запрос, чтобы возможно было работать с такими полями, как с обычной датой?

https://msdn.microsoft.com/en-us/library/hh213233.aspx
13 июл 15, 09:48    [17884248]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
formfactor
Member

Откуда: Dnipro
Сообщений: 40
Прошу прощения, я не указал версию: используется MS SQL 2005.

Судя по приведенному Вами линку, данное решение применимо только для MS SQL 2012 и выше.
13 июл 15, 09:55    [17884268]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
Glory
Member

Откуда:
Сообщений: 104760
https://msdn.microsoft.com/en-us/library/ms187928.aspx
13 июл 15, 09:57    [17884276]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
ГуЗы
Guest
formfactor
:( Запиливается программуля на Delphi, в которой должна производиться выборка из таблицы по дате, используя компоненты работы с Датой/Временем (TDateTimePicker).

A с дельфи не очень?
Там, ЕМНИП, есть decodedate и обратная процедуры.
13 июл 15, 10:01    [17884291]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
SELECT STR(10000*YYYY+100*MM+DD) FROM [таблица];
13 июл 15, 10:01    [17884292]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
formfactor
Member

Откуда: Dnipro
Сообщений: 40
Да, я пробовал использовать CAST + CONVERT, DATEADD и множество других найденных вариантов с форума, но то ли лыжи не едут, то ли я... Как я уже написал, в синтаксисе подобных функций ориентируюсь очень слабо. Если Вас не затруднит, напишите, пожалуйста, пример с выборкой.
13 июл 15, 10:01    [17884293]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
xenix
Guest
WITH CTE(DD,MM,YYYY)AS
(
  SELECT '17','07','2005' UNION ALL
  SELECT '20','02','2012' UNION ALL
  SELECT '31','03','2015'
)
SELECT DD,MM,YYYY,
CAST(CAST(C.YYYY AS CHAR(4))+CAST(C.MM AS CHAR(2))+CAST(C.DD AS CHAR(2))AS DATE)
 FROM CTE C
13 июл 15, 10:01    [17884295]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
iap
SELECT STR(10000*YYYY+100*MM+DD) FROM [таблица];
А для сравнения с другими датами лучше пользоваться самими полями без преобразования в дату.
Альтернатива: создать вычисляемое поле и проиндексировать его.
13 июл 15, 10:03    [17884301]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
xenix
WITH CTE(DD,MM,YYYY)AS
(
  SELECT '17','07','2005' UNION ALL
  SELECT '20','02','2012' UNION ALL
  SELECT '31','03','2015'
)
SELECT DD,MM,YYYY,
CAST(CAST(C.YYYY AS CHAR(4))+CAST(C.MM AS CHAR(2))+CAST(C.DD AS CHAR(2))AS DATE)
 FROM CTE C
WITH CTE(DD,MM,YYYY)AS
(
  SELECT '17','07','2005' UNION ALL
  SELECT '20','02','2012' UNION ALL
  SELECT '31','03','2015'
)
SELECT DD,MM,YYYY,
CAST(STR(10000*C.YYYY+100*C.MM+C.DD) AS DATE)
 FROM CTE C
13 июл 15, 10:06    [17884314]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
formfactor
Member

Откуда: Dnipro
Сообщений: 40
Благодарю за помощь, а особенно, iap. Помог этот вариант:
iap
SELECT STR(10000*YYYY+100*MM+DD) FROM [таблица];

В итоге получился следующий запрос, позволяющий выбирать интервалы времени:
select * from dbo.table WHERE (STR(10000*YYYY+100*MM+DD) BETWEEN (STR(10000*2015+100*5+28)) AND STR(10000*2015+100*6+7)) ORDER BY YYYY, MM, DD

или же TO_CHAR вместо STR, если применять к Oracle.

iap
WITH CTE(DD,MM,YYYY)AS
(
  SELECT '17','07','2005' UNION ALL
  SELECT '20','02','2012' UNION ALL
  SELECT '31','03','2015'
)
SELECT DD,MM,YYYY,
CAST(STR(10000*C.YYYY+100*C.MM+C.DD) AS DATE)
 FROM CTE C


так и не понял, как использовать этот вариант :/

ГуЗы
formfactor
:( Запиливается программуля на Delphi, в которой должна производиться выборка из таблицы по дате, используя компоненты работы с Датой/Временем (TDateTimePicker).

A с дельфи не очень?
Там, ЕМНИП, есть decodedate и обратная процедуры.


Это первый вариант, который я опробовал. Но выборка исключительно по имеющимся столбцам отображала не все значения. Например, при запросе выборки даты между 04-05-2015 и 17-06-2015, выбирались все дни, стоящие между 04 и 17. Верхний и нижний диапазон (1..4) и 17-31 не охватывался.
13 июл 15, 15:18    [17885951]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
formfactor,

Вроде же я написал, что не годится применять BETWEEN к результату функции, вычисляющей дату?
Это только для вывода в списке SELECTе прокатит.
А не в предикате в WHERE.
Если Вам некуда торопиться или таблица ещё маленькая, то сойдёт...
13 июл 15, 16:10    [17886308]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление времени по разным полям  [new]
formfactor
Member

Откуда: Dnipro
Сообщений: 40
iap,

да Вы говорили. Это значительно будет влиять на скорость выборки? С начала этого года в таблице собралось около 8,5к записей. Таблица вроде как получается небольшой. Но другого варианта я не знаю, кроме как, вопреки существующему, принудительно добавить поле с нормальной датой.
13 июл 15, 17:04    [17886700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить