Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.72.224] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (15) « Первая ... 3 4 [5] 6 7 ... 14 15 все ( Перейти к последнему сообщению ) |
Сообщ.
#62
,
|
|
|
Цитата ^D^ima @ вот из-за этой мелочи у меня выдавало ошибку ВСЁ должно иметь алиасы. Абсолютно всё. Или должна быть стопроцентная убеждённость, что в данной конкретной точке алиас не обязателен. |
Сообщ.
#63
,
|
|
|
Ясно
|
Сообщ.
#64
,
|
|
|
Akina
Теоретический вопрос: если мне в этом-же запрос( Помогите с запросом (сообщение #3744524) )нужно получить результаты его-же но за другой период(некое сальдо), та как это лучше оформить? Как хранимую процедуру и ей передавать даты, или ещё существуют способы? Аля процедура\функция в самом запросе? |
Сообщ.
#65
,
|
|
|
Если безотносительно к конкретному тексту запроса, я верно понимаю, что задача такова: для некоей сложной выборки, в которой в качестве одного из условий вводится некий параметр (дата) нужно получить одновременно результаты этой выборки для некоего набора значений этого параметра?
Если так, я бы, наверное, пошёл именно по пути создания хранимой процедуры, которая в некотором формате примет набор значений этого параметра, для каждого значения получит требуемые результаты, и вернёт весь массив полученных данных во временной таблице с предопределённым именем, после чего он уже будет обрабатываться в соответствии с требуемой логикой. Само собой, в этой временной таблице кроме собственно ответных значений (в запросе по ссылке это поля Вид, СуммаПриход, СуммаРасход) должно быть предусмотрено поле, хранящее значение параметра, для которого получена данная конкретная запись (например, поле Дата, в которую литерально копируется значение даты, на которую рассчитываются заданные значения полей Вид, СуммаПриход и СуммаРасход). |
Сообщ.
#66
,
|
|
|
Akina
Временная таблица должна быть создана в таблицах базы данных? Добавлено Цитата Akina @ для некоей сложной выборки, в которой в качестве одного из условий вводится некий параметр (дата) нужно получить одновременно результаты этой выборки для некоего набора значений этого параметра? именно так. А то придется в этом-же запросе копировать его ещё раз с другими датами |
Сообщ.
#67
,
|
|
|
use [PJM10] go create procedure my1 @Day char(2), @month char(2) as begin ( select top 10 Employee.FileAs from Employee) end go my1 'DA','DQ' /* union all my1 'DA','DQ' */ 1 почему предупреждение: "В базе данных уже существует объект с именем "my1"." 2 почему на union all ругается если раскоментить, хотя если вместо него поставить go, то работает, но 2 таблицы выдает? |
Сообщ.
#68
,
|
|
|
https://msdn.microsoft.com/en-us/library/ms...v=sql.105).aspx
1) Прежде чем создавать процедуру, надо проверить существование предыдущей версии, и если она есть - удалить её. IF OBJECT_ID ( 'SchemaName.procedureName', 'P' ) IS NOT NULL DROP PROCEDURE SchemaName.procedureName; GO 2) Выполнение процедуры без EXECUTE (или сокращённой его формы EXEC) допускается лишь в случае, если её вызов является первым оператором (всего пакета, или отдельного блока пакета, т.е. непосредственно после GO). Во всех остальных случаях EXEC(UTE) обязателен. |
Сообщ.
#69
,
|
|
|
exec my1 'DA','DQ' union all exec my1 'DA','DQ' так все равно на union all ругается |
Сообщ.
#70
,
|
|
|
Ну ещё бы... ты хоть иногда в мануал-то заглядывай. UNION/EXCEPT/INTERSECT может объединять только запросы, а не любые конструкции, возвращающие набор записей.
|
Сообщ.
#71
,
|
|
|
Печально, спасибо.
А как можно взять дату: Первый день прошлого месяца и Последний день прошлого месяца '01.09.2017 00:00:00' - '30.09.2017 23:59:59'? Первый день взял так select convert(datetime, '01.'+convert(char(2), month(getdate())-1)+'.'+convert(char(4), year(getdate())) ) Добавлено Последний день предыдущего месяца взял так: EOMONTH(GETDATE( ),-1) |
Сообщ.
#72
,
|
|
|
Получилось 2 вариантами:
не знаю какой более правильный: select SMALLDATETIMEFROMPARTS(year(EOMONTH(GETDATE( ),-1)), month(EOMONTH(GETDATE( ),-1)),day(EOMONTH(GETDATE( ),-1)),'23','59') select convert(datetime, convert(char(10), EOMONTH(GETDATE( ),-1))+'T23:59:59') Добавлено Первый день прошлого месяца: select convert(date, dateadd(month,-1, dateadd(day,1-day(GETDATE( )),GETDATE( )) ) ) Я правильно понимаю если date сравнивают с datetime, то подразумевают что в date время '00:00:00' ??? Т.е. если в date и datetime будет одинаковая дата, то в не зависимости от времени они будут равны? Добавлено Пока взял это: declare @d1 datetime declare @d2 datetime set @d1=convert(date, dateadd(month,-1, dateadd(day,1-day(GETDATE( )),GETDATE( )) ) ) set @d2=convert(datetime, convert(char(10), EOMONTH(GETDATE( ),-1))+'T23:59:59') select @d1 select @d2 Это я к чему всё, чтобы избавиться от этой конструкции: ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1) А то получается что, действительно, в январе 2018 я буду получать данные не 12.2017 а 12.2018, хотя я мог бы чтото с IF'ом нагородить и отнимать год если месяц первый |
Сообщ.
#73
,
|
|
|
Тебе нужно взять весь предыдущий месяц, верно? то есть больше или равно 0:00 первого числа и строго меньше 0:00 первого числа следующего (в данном конкретном случае текущего) месяца. Т.е.
WHERE mydate >= DATEADD(day,1,EOMONTH(GETDATE(),-2)) AND mydate < DATEADD(day,1,EOMONTH(GETDATE(),-1)) Цитата ^D^ima @ Я правильно понимаю если date сравнивают с datetime, то подразумевают что в date время '00:00:00' ??? Тип date не содержит компоненты времени. При сравнении данные приводятся к общему формату, не теряющему точность, т.е. к datetime. Т.е. к date добавляется компонента времени, а раз для неё нет значение, то нулевая. Так что всё правильно. Цитата ^D^ima @ Это я к чему всё, чтобы избавиться от этой конструкции В первую очередь ты должен избавиться от любых действий, кроме сравнений, для полей таблицы. Для текущей даты значение вычислится один раз, каким бы ни было сложным выражение, а для значений из таблицы - для каждой записи. Что дольше и затратнее? Опять же - в каком случае можно использовать индекс? |
Сообщ.
#74
,
|
|
|
Цитата Akina @ WHERE mydate >= DATEADD(day,1,EOMONTH(GETDATE(),-2)) AND mydate < DATEADD(day,1,EOMONTH(GETDATE(),-1)) Прикольно. Это как-то через between передать можно? |
Сообщ.
#75
,
|
|
|
Цитата ^D^ima @ Это как-то через between передать можно? Изучи https://msdn.microsoft.com/en-us/library/ms...v=sql.105).aspx , особенно последний пример с пояснениями. Как я из них понял - нельзя, но вдруг я ошибаюсь... |