Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Код с условием по датам с запуском запроса

Добрый день.

Подскажите пожалуйста, как прописать запуск запроса по условию с датами? Примерно должно быть так:

If "Время сейчас" между 08:00 и 20:00 Then
Запускаем "Один запрос"
Else Запускаем "Другой запрос"
End If

По датам еще не делал такие вещи. Подскажите пожалуйста)))
Ответ:
Сообщение от Dimasterfrom4e
Записи перестают быть актуальными, поэтому лишние.
В СУБД лишних записей не бывает, только во временных таблицах.

Вы на сервере Акцесс запустить можете, чтобы он был постоянно запущен?
Вопрос: Вывод во временную таблицу значений системной даты и времени в столбец Х

Задание: Выведите во временную таблицу значение системной даты и времени в столбец Х
Правильно ли я его сделала?
SQL
1
SELECT sysdate AS X FROM dual
Ответ: Grossmeister, да, согласен, вполне можно обойтись только insert'ом
Вопрос: Сортировка даты

Всем привет.
Вот уже который день бьюсь головой не могу сделать.
Надеюсь поможете.
В общем есть таблица в ней ФИО и дата рождения. Нужно отсортировать по дате таким образом чтоб первым стал тот у кого дата рождения ближе к сегодняшней дате.
Пример:
[Иванов Иван]: [09-06]
[Сидоров Петр]: [12-12]
[Васечкин Петя]: [12-31]
А сегодня 9 декабря (год не учитывается), отсортироваться должны так:
Сидоров, Васечкин, Иванов.
Если это невыполнимо, то подскажите как правильней сделать.....
Буду очень благодарен.
Ответ: Очень интересная задача.
Думаю ( может со мной не согласятся более умные коллеги), что решить эту задачу одним SQL-запросом не получится.
Здесь две проблемы:
1) Очень мешает год, он у всех дат разный
2) Нет сквозной нумерации месяцев: после 12-го месяца наступает 1-й месяц

Предлагаю следующее решение:
1) В таблице создать вспомогательный столбец типа даты (назовем его data_r1)
2) Таким образом, структура таблицы будет, например, такой:
tab1(fio, data_r, data_r1)
3) Для каждой строки таблицы поле data_r1 есть копия поля data_r, за исключением года. Год у всех дат будет одинаковый, например, 2016, но только на этом шаге.
4) На втором шаге, будем менять год у столбца data_r1 следующим образом:
• Если месяц в data_r1 > месяца в тек дате, то оставляем год без изменения.
• Если месяц в data_r1 < месяца в тек дате, то добавляем к году 1 ( т. е. это будет уже следующий год).
• Если месяц в data_r1= месяцу в тек дате, то проверяем день: если день в data_r1< дня в тек дате, то добавляем к году 1 (т. е. будем поздравлять этих людей уже в следующем году).
5) Подготовив, таким образом, вспомогательное поле data_r1, теперь можно запустить запрос:
SQL
1
SELECT * FROM tab1 ORDER BY data_r1 - curdate();
Т. е. сортировка по разнице поля data_r1 и текущей даты по возрастанию.
Вопрос: Порядок новых строк при записи в таблице (не сортировка!)

Вот была задачка, реализовать базу на аксессе (в нём я чуть чуть понимаю)

решил создать по образу и подобию другой базы (задолго до меня внедренную в нашу больничку для кассы, заодно и немного поучиться), они были идентичны и не работал лишь 1 механизм, как оказалось из-за того что в моей базе новые значения в главную таблицу записываются в конец, а в той с которой копировал в начало таблицы....

Где это настраивается я так и не нашёл, но если скопировать (перетащил из одного окна в другое) таблицу то свойство тоже копируется.

Подскажите это магия? или Где это настраивается? Ну очень интересно, как сделать также с нуля а не копированием. (использую 2013 Access)

Для наглядности прикладываю базу с этими двумя таблицами, моя "Анестезия" в неё пишутся в конец новые строки, не моя "Договора" в неё почему то записываются строки в начало, и это не сортировка.
Ответ: 1)Откройте для себя запросы как источники данных для форм, там есть возможность отсортировать записи так, как вам захочется, хоть по ключу, хоть по дате.
2)Формы за редким исключением, должны иметь источник данных и не надо будет никаких запросов на добавление городить.
И хватит уже меня смешить, живот болит.
Вопрос: Как засунуть это условие по дате в фильтр?

Делаю фильтрацию по отчёту. Столкнулся с проблемой даты. Я уже сталкивался, и есть опыт создания такого фильтра:

Visual Basic
1
СТРОКА_ФИЛЬТРА = СТРОКА_ФИЛЬТРА & IIf(СТРОКА_ФИЛЬТРА = "", "Дата <= #" & Format(Me.ДатаПолеПо, "mm\/dd\/yyyy") & "#", " AND Дата <= #" & Format(Me.ДатаПолеПо, "mm\/dd\/yyyy") & "# ")
То есть тут фильтруется по условию:
Visual Basic
1
Дата <= #" & Format(Me.ДатаПолеПо, "mm\/dd\/yyyy") & "#
А мне в фильтр надо теперь засунуть другое условие, условие которое позволит просмотреть данные по текущему кварталу:
Visual Basic
1
Year([Дата]) = Year(Now()) And DatePart("q"; Date()) = DatePart("q"; Now())
такое не срабатывает:
Visual Basic
1
СТРОКА_ФИЛЬТРА = СТРОКА_ФИЛЬТРА & IIf(СТРОКА_ФИЛЬТРА = "", "Year([Дата]) = Year(Now()) And DatePart("q"; Date()) = DatePart("q"; Now())", " AND Year([Дата]) = Year(Now()) And DatePart("q"; Date()) = DatePart("q"; Now())")
Ответ: mobile, ох ё, сейчас попробую переварить

Добавлено через 5 минут
Сообщение от mobile
Visual Basic
1
2
СТРОКА_ФИЛЬТРА = iif(Nz(СТРОКА_ФИЛЬТРА,"")<>"", " and True ", СТРОКА_ФИЛЬТРА & " True ")
СТРОКА_ФИЛЬТРА=СТРОКА_ФИЛЬТРА & " and Year([Дата])=Year(Date()) And DatePart("q", Date()) = DatePart("q", [Дата])"
А для чего вообще нужно " and True " и " True "?
Это же тогда фильтр в случае если строка была пустой будет:
Visual Basic
1
"True and Year([Дата])=Year(Date()) And DatePart("q", Date()) = DatePart("q", [Дата])"
Добавлено через 8 минут
Нашёл проблему, она оказалась в кавычках: "q".
Заменил на: 'q' и заработало.

Итоговый вариант:
Visual Basic
1
        СТРОКА_ФИЛЬТРА = СТРОКА_ФИЛЬТРА & IIf(СТРОКА_ФИЛЬТРА = "", "Year([Дата])=Year(Date()) And DatePart('q', Date()) = DatePart('q', [Дата])", " AND Year([Дата])=Year(Date()) And DatePart('q', Date()) = DatePart('q', [Дата])")
Вопрос: Соседние записи таблицы после сортировки.

Ребята, помогите пожалуйста оптимизировать запрос.
есть таблица pictures

CREATE TABLE  `pictures` (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `pdatetime` datetime DEFAULT NULL,
  `pname` text,
  `plink` varchar(100) DEFAULT NULL,
  `tlink` varchar(100) DEFAULT NULL,
  `pviewers` int(11) DEFAULT '0',
  `pwidth` smallint(4) DEFAULT NULL,
  `pheight` smallint(4) DEFAULT NULL,
  PRIMARY KEY (`pid`),
  KEY `pviewers` (`pviewers`,`pwidth`,`pheight`),
  KEY `plastviewip` (`plastviewip`),
  KEY `plike` (`plike`,`pdislike`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COMMENT='Картинки' 


делаю выборку с сортировкой pwidth+pheight (ширина+высота рисунка)

SELECT * FROM pictures ORDER BY  pwidth+pheight desc  


Выводится список всех рисунков по данной сортировки.

Потом делаю запрос для выбора одного рисунка по его PID
 SELECT * FROM pictures WHERE pid=1234


задача: необходимо найти предыдущие и следующие элементы по данной сортировки относительно текущего PID
решил задачу топорно т.к. не так много рисунков, всего 4 000, и запрос занимает (0.0090сек)

нахожу его позицию $start через запрос:
SELECT num FROM (SELECT @i:=@i+1 num,pid FROM pictures , (SELECT @i:=0) x   ORDER BY pwidth+pheight desc ) as t WHERE t.pid=1234 


после его смещаю на -5 и проверяю на отрицательное число
 <?
 $start=$db->sres()-5;
    if($start<0) $start=0; 
?>


после делаю основной запрос:

SELECT * FROM pictures ORDER BY  pwidth+pheight desc LIMIT $start,9


и получаю по середине данную картинку и 4 следующие и 4 предыдущие.
Как можно оптимизировать запрос?
Ответ:
darknesmonk
делаю выборку с сортировкой pwidth+pheight (ширина+высота рисунка)
Крайне неудачный выбор. Эта сортировка гарантирует фуллскан и файлсорт. Если сортировка по этому критерию действительно очень важна - пересмотрите структуру хранения.
Первый вариант - дополнительное поле, хранящее эту сумму и обновляемое из триггера. Правда, получается избыточность и потенциальное рассогласование данных.
Второй вариант - то же, но не дополнительно, а взамен одного из двух полей. Если одно из этих полей не участвует в обработках (сортировках, отборах и связываниях), а только отдаётся в выходном наборе - это лучший вариант.

В случае же, если версия сервера не младше 5.7.6, возможно использование . Первый вариант аналогичен STORED полю, второй - VIRTUAL полю. На InnoDB оба варианта допускают создание по ним индекса.
Вопрос: Выбрать минимальную дату про одинаковых ID (сложное)

Есть вот такой вот запрос который подсчитывает количество ИБП по годам
Код SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(SELECT 'ИБП' AS name, TO_CHAR(t.data_n, 'YYYY') AS DATA, COUNT(TO_CHAR(t.data_n, 'YYYY')) AS COUNT
 
FROM ups  t
 
WHERE t.data_k IS NULL AND t.data_n IS NOT NULL
 
GROUP BY TO_CHAR(t.data_n, 'YYYY')
 
UNION ALL
 
SELECT 'ИБП', NULL, COUNT(*) 
FROM 
(
SELECT TO_CHAR(t.data_n, 'YYYY') FROM ups t 
WHERE 
TO_CHAR(t.data_n, 'YYYY') IS NULL AND data_k IS NULL
)
)) ORDER BY 1,2
Выдаёт он вот это... и те 39 ИБП это те у которых в таблице ups нет даты совсем ни какой null зато нужные мне даты есть в некой таблице sklad

Код SQL
1
2
3
4
5
6
7
8
9
10
   Name DATA   COUNT
1   ИБП 2005    2
2   ИБП 2007    1
3   ИБП 2008    8
4   ИБП 2009    4
5   ИБП 2010    28
6   ИБП 2011    16
7   ИБП 2012    2
8   ИБП 2013    3
9   ИБП         39 -- это часть юнион
Я попытался переписать запрос дабы эти 39 попали в подсчёт связав таблицу ups и skald по id убрав юнион

Код SQL
1
2
3
4
5
6
7
8
9
(SELECT 'ИБП' AS name,TO_CHAR(t.data_n, 'YYYY') AS DATA,
COUNT(TO_CHAR(t.data_n, 'YYYY')) AS COUNT 
 
FROM ups  t,sklad d
JOIN ups z ON z.id=d.id 
WHERE t.data_k IS NULL AND t.data_n IS NOT NULL
AND t.id=d.id
GROUP BY TO_CHAR(t.data_n, 'YYYY') 
)) ORDER BY 1,2
Вот что мне выдал запрос

Код SQL
1
2
3
4
5
6
7
8
9
   Name DATA   COUNT
1   ИБП 2005    10
2   ИБП 2007    8
3   ИБП 2008    23
4   ИБП 2009    14
5   ИБП 2010    158
6   ИБП 2011    49
7   ИБП 2012    15
8   ИБП 2013    17
Я считаю запрос верен на все 99% но проблема заключается вот в чём в этой самой таблице sklad в ней может быть много одинаковых ID с разными датами и получается что на 1 ID может быть от 1 до 10 дат которые подсчитываются из-за этого так увеличились цифры... Так вот мне же нужно сделать так чтобы у каждого Id sklad которые совпадёт с таблицей UPS выбиралась только 1 дата минимальная для данного id
Например в таблице ups нет даты для id 261 в таблице sklad есть

Код SQL
1
2
3
261 28.08.2012 10:46:17
261 17.09.2008 14:46:51
261 24.01.2011 14:48:55
Нужно чтобы в запрос подсчитывалась минимальная дата остальные нет то есть нужна 17.09.2008
Очень надеюсь на вашу помощь +)))
Ответ: Lorsik, Спасибо и за это, нашел уже просто какой-то умелец до меня решил не в ручную таблицу заполнить и даты заполнились аж с 1190 года =)) Пришлось всё править теперь всё работает как часы и показывает те у которых даты не заполнены =))
Вопрос: Создание таблицы с диапазоном дат

Здравствуйте,
В форме есть два поля "ДатаС" и "ДатаПо"
Как правильно написать запрос, чтобы он формировал таблицу "Календарь" с одним столбцом "Дата", а строками были даты от ДатаС по ДатаПо.
Например, ДатаС=01.01.2016, ДатаПо= 31.01.2016. Формировалась бы таблица "Календарь"
Дата
1 01.01.2016
2 02.01.2016
3 03.01.2016
...
31 31.01.2016
Этот запрос далее будет использоваться для построения других запросов
Ответ:
Serega_555
Как правильно написать запрос, чтобы он формировал таблицу "Календарь" с одним столбцом "Дата", а строками были даты от ДатаС по ДатаПо.
Получить непрерывный ряд чисел или дат можно с помощью широко известного посетителям сайта запроса digits. Вот
Например:
SELECT Date()-999 + (D2.digit & D1.digit & D0.digit) AS d
FROM Digits AS D0, Digits AS D1, Digits AS D2;
Запрос возвращает 1000 дат по текущую.
Если в вашем запросе его связать (LEFT JOIN) с таблицей "События" и отфильтровать по диапазону дат - получите искомое.
Вопрос: Запрос данных из нескольких связанных таблиц с максимальной датой

Добрый вечер!

Прощу помощи в составлении запроса в Access. Если где то рассматривалась похожая проблема, ткните меня.
Имеется три таблицы:
+ Таблицы:

Дела
ИдДела...
17А001...
101А021...
73А073...
..........

Движение
ИдДвиженияИдДелаДатаДвиженияИДВидДвижения
11701.09.20161
21711.09.20162
310127.08.20161
47328.08.20161
57307.09.20163
610122.09.20162
..........

Виды движений
ИДВидДвиженияНаименование
1Оценка
2Передано в юр отдел
3Иск


Таблицы между собой связаны по первичному ключу.
Задача: узнать на какой последней стадии находится каждое из дел.
+ Что должно получиться:

ИдДелаДатаСтадия
1718.09.2016Передано в юр отдел
10121.09.2016Передано в юр отдел
7316.09.2016Иск


Заранее благодарен!

К сообщению приложен файл. Размер - 31Kb
Ответ:
SELECT MainTable.ИдДела
     , MainTable.ДатаДвижения AS Дата
     , [Виды движений].Наименование
FROM Движение AS MainTable
JOIN (SELECT ИдДела, MAX(ДатаДвижения) AS ДатаДвижения)
     FROM Движение
     GROUP BY ИдДела
     ) AS SubQuery
  ON  MainTable.ИдДела = SubQuery.ИдДела AND MainTable.ДатаДвижения = SubQuery.ДатаДвижения
JOIN [Виды движений]
  ON MainTable.ИДВидДвижения = [Виды движений].ИДВидДвижения
Вопрос: Как вывести пустые поля если есть условие?

имеется три таблицы, по которым мне нужно сделать запрос. Если без условия по дате, то выводит соответственно все поля. А если с условием то выводит не все поля.
Мне необходимо чтобы из таблицы GRUPPA выводились все поля, сумма Col_uved на конкретную дату, а те поля где нет Col_uved выводились пустыми.

К сообщению приложен файл. Размер - 21Kb
Ответ:
SELECT name_gr AS Группа, #04/29/2016# AS Дата, Протоколы, Уведомления, Предписания
FROM GRUPPA INNER JOIN 
(SELECT cod_gr, Sum(C*(V=1)*(D=#04/29/2016#)) AS Уведомления, Sum(C*(V=2)*(D=#04/29/2016#)) AS Предписания, Sum(C*(V=3)*(D=#04/29/2016#)) AS Протоколы
FROM (SELECT V, cod_gr, C, D 
FROM TEMA LEFT JOIN
(SELECT 1 AS V, UVED.cod_tem AS T, UVED.col_uved AS C, UVED.data_uved AS D FROM UVED
UNION ALL
SELECT 2, PRED.cod_tem, PRED.col_pred, PRED.data_pred FROM PRED
UNION ALL 
SELECT 3, PROT.cod_tem, PROT.col_prot, PROT.data_prot FROM PROT) AS Q
ON TEMA.cod_tem=Q.T) AS QQ
GROUP BY cod_gr) AS QQQ ON GRUPPA.cod_gr=QQQ.cod_gr
ORDER BY name_gr;
Группа Дата Протоколы Уведомления Предписания
Благоустройство 29.04.2016 0 0 0
Временные сооружения 29.04.2016 0 0 0
Земляные работы 29.04.2016 0 0 0
Реклама 29.04.2016 2 5 1
Торговля 29.04.2016 1 0 0