Получите просто Дату от группировки в выборе из столбца DateTime в SQL Server

После некоторой работы я понял это.
Вот код для триггера для вставки на sales_order_parts. Он суммирует значение всех полей открытых ордеров order_quantity, сгруппированных по частям, и устанавливает значение в поле amount_allocated в master_parts_list. Он опускает все кавычки и уже заказанные заказы.

create trigger allocated_addition_insert
after insert on sales_order_parts
for each row
update master_part_list
set master_part_list.quantity_allocated=
    (select sum(order_quantity)
from
    sales_orders
        inner join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
where sales_orders.invoice_number is null 
and sales_order_parts.part_id = master_part_list.id 
and sales_orders.status <> "Quote" 
group by part_id);

Это обновление значения измененного количества в sales_order_parts. Вот код для триггера перед обновлением в sales_order_parts.

create trigger allocated_minus_update
before update on sales_order_parts
for each row
    update master_part_list set master_part_list.quantity_allocated = master_part_list.quantity_allocated - old.order_quantity
    where master_part_list.id = old.part_id;

Вот код для триггера после обновления на sales_order_parts.

create trigger allocated_add_update
after update on sales_order_parts
for each row
    update master_part_list set master_part_list.quantity_allocated = master_part_list.quantity_allocated + new.order_quantity
    where master_part_list.id = new.part_id;

Вот код для обновления на sales_orders.

delimiter $
create trigger allocated_order_on_hand_update
after update on sales_orders
for each row begin
    update master_part_list
    set master_part_list.quantity_on_hand = master_part_list.quantity_on_hand -
    coalesce((select sum(ship_quantity)
    from
    sales_order_parts
            inner join
    sales_orders on sales_orders.id = sales_order_parts.order_id
    where sales_orders.invoice_number = new.invoice_number
    and sales_order_parts.part_id = master_part_list.id
    and new.invoice_number > 0
    group by sales_order_parts.part_id),0);

    update master_part_list
    set master_part_list.quantity_allocated=
    (select sum(order_quantity)
    from
    sales_orders
        inner join
    sales_order_parts on sales_orders.id = sales_order_parts.order_id
    where sales_orders.invoice_number is null 
    and sales_order_parts.part_id = master_part_list.id 
    and sales_orders.status <> "Quote" 
    group by part_id);
end$
delimiter ;

Эти триггерные скрипты хорошо работают для меня, но любые предложения или комментарии приветствуются. Благодаря.

9
задан casperOne 13 February 2009 в 14:12
поделиться

6 ответов

Можно сгруппироваться этим:

cast(floor(cast(AutoShipItems.NextOrderDate as float)) as datetime)

Я поместил это в скалярную пользовательскую функцию для помощи:

create function [dbo].[xfn_TrimTimeFromDateTime]
(
    @date as datetime
)
returns datetime with schemabinding as
begin
    --- Convert to a float, and get the integer that represents it.
    --- And then convert back to datetime.
    return cast(floor(cast(@date as float)) as datetime)
end

Который Вы затем назвали бы как это:

GROUP BY
    AutoShipItems.CustomerID, 
    dbo.xfn_TrimTimeFromDateTime(AutoShipItems.NextOrderDate), 
    Customer.FirstName, Customer.LastName, Customer.EmailAddress

Обратите внимание, что Вам, возможно, придется изменить значения в ИЗБРАННОМ пункте, так как Вы группируетесь чем-то другим теперь.

23
ответ дан 4 December 2019 в 06:17
поделиться
cast (x as date)

или

year(x)
month(x)
day(x)
14
ответ дан 4 December 2019 в 06:17
поделиться

См. эту ссылку для трех различных версий функции только для даты. Вот тот, который я закончил тем, что использовал:

CREATE FUNCTION [dbo].[fn_GetDateOnly]  ( @pInputDate    DATETIME )
RETURNS DATETIME
BEGIN

    RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)

END
0
ответ дан 4 December 2019 в 06:17
поделиться

Что относительно этого:

select convert(datetime, convert(varchar(10), getdate(), 112))
2
ответ дан 4 December 2019 в 06:17
поделиться

Если это все примерно группируется, можно преобразовать выражение даты и времени в интервал также.

Простой CAST(datetime AS int) на самом деле округляет дату и время на ближайшую дату, а не отбрасывает часть времени. Отсюда,

CAST(datetime - 0.5 AS int)

Иначе:

CAST(CAST(datetime AS float) AS int)

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

Я предпочитаю первого, поскольку это короче. Не уверенный, который лучше с точки зрения производительности, все же. Однако, проблема может, вероятно, только возникнуть на действительно больших массивах данных.

0
ответ дан 4 December 2019 в 06:17
поделиться

Можно также просто использовать простой SQL, преобразовывают функцию. Последний аргумент позволяет Вам обеспечить pre-deifined форматы даты, некоторые из которых удаляют время. Вот пересмотренный запрос.

SELECT    AutoShipItems.CustomerID, convert(nvarchar(10), AutoShipItems.NextOrderDate, 110) as NextOrderDate ,Customer.FirstName,Customer.LastName, 
                     Customer.EmailAddress
FROM        AutoShipItems INNER JOIN
                     Customer ON AutoShipItems.CustomerID =Customer.CustomerID
WHERE     (AutoShipItems.NextOrderDate <= GETDATE())
GROUP BY AutoShipItems.CustomerID, convert(nvarchar(10), AutoShipItems.NextOrderDate, 110) , Customer.FirstName, Customer.LastName, 
                     Customer.EmailAddress
ORDER BY AutoShipItems.NextOrderDate
0
ответ дан 4 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: