Есть ли способ привести две манипуляции с датой в один столбец при написании запроса? - PullRequest
0 голосов
/ 01 июля 2019

Простите за вопрос нуб, ребята! Я довольно нов, когда дело доходит до запросов к базам данных. Ну, короче, я пытаюсь рассчитать месяц за месяцем. Я хотел создать столбец для продаж, которые, по сути, перенесены на один месяц, что позволит мне создать расчет для MoM по ((SalesColumn - PressedSales) / PressedSales) * 100.

Моя цель состоит в том, чтобы в первую очередь переместить часть месяца на 1 месяц, а во-вторых, чтобы изменить часть дня на 1-е число месяца.

Я пытаюсь найти способ накопить эти два утверждения.

DATEADD(MONTH, 1, Order_Date) & DATEFROMPARTS(YEAR(Order_Date), MONTH(Order_Date), DAY(0))

ЧАСТЬ 1:

SELECT DATEADD(MONTH, 1, Order_Date), Sales
FROM Orders
ORDER BY Order_Date

ЧАСТЬ 2:

SELECT DATEFROMPARTS(YEAR(Order_Date),MONTH(Order_Date),DAY(0)), Sales
FROM Orders
ORDER BY Order_Date

То, что я сделал, завершено ЧАСТЬ 1:

SELECT DATEADD(MONTH, 1, Order_Date), Sales
FROM Orders
ORDER BY Order_Date

И создал вид,

Затем, используя это представление, я сделал ЧАСТЬ 2:

SELECT DATEFROMPARTS(YEAR(Order_Date), MONTH(Order_Date), DAY(0)),[Sales]
FROM Orders
ORDER BY Order_Date

Что дает мне правильный ответ, за исключением ощущения, что это очень неэффективный способ манипулирования датами.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

SQLServer 2012+ имеет функцию EOMonth, которая возвращает последний день месяца, дату, которую вы передаете. Добавление одного дня к этому дает вам начало следующего месяц (нет SOMonth следствия увы)

DATEADD(Day, 1, EOMonth(Order_Date))

Перейдите 23 января 2000 г. к этому, оно будет засчитано к 31 января 2000 г., а затем добавится один день, чтобы получить 1 февраля 2000 г.

Вам не нужно создавать представления, чтобы использовать выходные данные одной функции в качестве входных данных для другой, просто цепочка (гнездо) функций:

A(B(C(column)))

Это вызывает функцию C и передается в столбце, затем принимает вывод из C и передает его в B, затем принимает вывод из B и передает его в A

Было бы целесообразно правильно отформатировать (сделать отступ) свой код, если вы собираетесь вкладывать много вызовов функций, каждый с аргументами

0 голосов
/ 01 июля 2019

Если я вас правильно понимаю, я думаю, что это дает вам то, что вы хотите: dateadd(month,1,dateadd(day,1-day(Order_Date),Order_Date))

...