sql-server - operaciones - obtener mes y año de una fecha sql
Obtenga solo la fecha de la agrupación en seleccionar de la columna DateTime en SQL Server (7)
¿Qué tal esto?
select convert(datetime, convert(varchar(10), getdate(), 112))
Necesito agrupar algunos registros basados en una fecha, pero es un campo de fecha y hora y necesito ignorar la parte de tiempo de es y solo agrupar por la parte de fecha - aquí está mi SQL tal como está:
SELECT
AutoShipItems.CustomerID,AutoShipItems.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, AutoShipItems.NextOrderDate,
Customer.FirstName, Customer.LastName,
Customer.EmailAddress
ORDER BY
AutoShipItems.NextOrderDate
También puede usar simplemente la antigua función de convertir SQL. El último argumento le permite proporcionar formatos de fecha predefinidos, algunos de los cuales eliminan la hora. Aquí está la consulta revisada.
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
Vea este enlace para tres versiones diferentes de una función de solo fecha. Aquí está el que terminé usando:
CREATE FUNCTION [dbo].[fn_GetDateOnly] ( @pInputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
END
Si todo se trata solo de agrupar, también puede convertir la expresión de fecha y hora a int.
Simple CAST(datetime AS int)
realmente redondea la fecha y hora a la fecha más cercana en lugar de descartar la parte del tiempo. De allí,
CAST(datetime - 0.5 AS int)
De otra manera:
CAST(CAST(datetime AS float) AS int)
(A diferencia de los tiempos de las fechas, los flotantes se truncan cuando se lanzan a int.)
Prefiero el primero ya que es más corto. Sin embargo, no estoy seguro de cuál es mejor en términos de rendimiento. Aún así, el problema probablemente solo surja en grandes conjuntos de datos.
cast (x as date)
o
year(x)
month(x)
day(x)
Puede agrupar por esto:
cast(floor(cast(AutoShipItems.NextOrderDate as float)) as datetime)
Puse esto en una función escalar definida por el usuario para que sea más fácil:
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
Que llamarías así:
GROUP BY
AutoShipItems.CustomerID,
dbo.xfn_TrimTimeFromDateTime(AutoShipItems.NextOrderDate),
Customer.FirstName, Customer.LastName, Customer.EmailAddress
Tenga en cuenta que puede tener que cambiar los valores en la cláusula SELECT, ya que ahora se está agrupando por algo diferente.