sql >> Base de Datos >  >> RDS >> Database

Uso de funciones DATEADD, DATEDIFF y DATEPART T-SQL en términos simples

Este artículo se enfoca en desarrollar una comprensión básica de cómo usar una de las funciones de fecha de Transact-SQL más comunes:DATEADD, DATEDIFF y DATEPART.

En este artículo, también subrayé la importancia de usar correctamente estas funciones de fecha en manipulaciones diarias de fechas, seguidas de algunos escenarios interesantes en los que estas funciones de fecha se pueden usar de forma colaborativa para resolver cálculos de fecha ligeramente complejos.

Dado que estas funciones se utilizan principalmente en la manipulación de fechas, primero tratemos de entender qué queremos decir con manipulación de fechas.

Comprender la manipulación de fechas

Los valores de fecha y hora a menudo deben modificarse según los requisitos, y el método de modificar, manejar o controlar los cálculos de fecha y hora se conoce como manipulación de fechas.

También nos referimos a esta situación (manipulación de fechas) cuando un valor de fecha se lee de una base de datos y luego se modifica antes de que se almacene nuevamente.

Escenario de pedido de cliente

Un ejemplo interesante de manipulación de fechas es un pedido de cliente escenario, cuando un pedido colocado por un cliente se procesa, la fecha de entrega debe establecerse 5 días antes de la fecha del pedido , por lo que esto significa que un desarrollador debe usar la(s) función(es) de fecha de T-SQL para manipular (modificar) la fecha del pedido para calcular la fecha de entrega .

Informe de ventas diarias de muestra

Un ejemplo un poco complejo es cuando un usuario comercial ejecuta un informe de ventas diarias. si muestra los resultados de ayer.

Por ejemplo, si ejecutamos el Informe de ventas diarias el domingo a las 11:00 nos mostrará resultados basados ​​en el sábado, y si lo ejecutamos el sábado a las 17:00, nos mostrará todos los resultados el viernes, porque el día actual aún no ha terminado y el más reciente día completo disponible es ayer. Así es como están diseñados para ejecutarse la mayoría de los informes diarios profesionales, incluidos los informes financieros.

En este ejemplo, la fecha actual se manipula (modifica) para obtener la fecha anterior, que contiene los registros de ventas de un día completo.

Implementación de los ejemplos

Tenga en cuenta los ejemplos anteriores, ya que implementaremos estos escenarios una vez que obtengamos una buena comprensión del uso de algunas de las funciones de fecha más comunes descritas en este artículo.

Comprender las funciones de fecha

Primero veamos algunas funciones básicas de fecha que pueden ayudarnos a cumplir con los requisitos de manipulación de fechas, como determinar los días entre dos fechas (fecha de pedido y fecha de entrega), obtener los registros de ventas de la semana pasada según la fecha actual o calcular la fecha de vencimiento esperada según el fecha de producción y así sucesivamente.

Dado que no existen reglas estrictas y rápidas, primero comenzamos a explorar la función DATEPART.

Uso de la función DATEPART

Definición sencilla

La función DATEPART se utiliza para devolver una parte de una fecha dada en un valor numérico.

La parte puede ser el día de la fecha, el mes de la fecha, el año de la fecha, etc.

Por ejemplo, podemos usar la función DATEPART para obtener el día de una fecha determinada para determinar si un pedido se realizó el domingo o no.

Otro ejemplo es obtener el mes de una fecha determinada para pasar a otra función de fecha para su posterior procesamiento.

Definición de Microsoft

Esta función devuelve un número entero que representa el datepart especificado. de la fecha especificada .

Compatibilidad

Según la documentación de Microsoft, esta función es compatible con las siguientes versiones de SQL Server:

  1. SQL Server 2008 más
  2. Base de datos Azure SQL
  3. Almacén de datos Azure SQL
  4. Almacén de datos en paralelo

Sintaxis

DATEPART (datepart , date)

Ejemplo 1:obtener el año como parte de la fecha

Definamos también una fecha determinada (OrderDate ) para obtener la parte deseada (Día, Mes, Año) usando la función DATEPART.

Para obtener el Año de la fecha del pedido, simplemente pasamos YEAR seguido de Fecha de pedido (@OrderDate) en el DATEPART funcionan de la siguiente manera:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Year of the Order Date
SELECT DATEPART(YEAR,@OrderDate) as Year_OrderDate

Ejemplo 2:Obtener parte del mes

Si nos interesa saber el mes de la fecha, entonces Mes debe pasarse a DATEPART funcionan de la siguiente manera:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Month of the Order Date
SELECT DATEPART(MONTH,@OrderDate) as Month_OrderDate

Ejemplo 3:Obtención de la parte del día

Para encontrar la parte Día de la fecha, simplemente pase DÍA en el DATEPART funcionan de la siguiente manera:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Day of the Order Date
SELECT DATEPART(DAY,@OrderDate) as Day_OrderDate

Ejemplo 4:Obtención de la parte del día de la semana

Para obtener la parte Día de la semana de la fecha, simplemente pase DÍA DE LA SEMANA en el DATEPART funcionan de la siguiente manera:

-- Define Order Date
DECLARE @OrderDate DATETIME2='2017-01-11'

-- Getting Week Day of the Order Date
SELECT DATEPART(WEEKDAY,@OrderDate) as WeekDay_OrderDate

Estamos recibiendo 4, que es miércoles a partir del domingo, que es 1.

Del mismo modo, también podemos obtener un Cuarto, Hora, Minuto, Segunda parte de la fecha.

Pasemos a la siguiente función de fecha.

Uso de la función DATEADD

Definición sencilla

La función DATEADD se utiliza para sumar o restar una fecha.

Por ejemplo, podemos saber cuál será la fecha después de cuatro días o cuatro días antes.

Esto es muy útil en los escenarios en los que la fecha esperada debe calcularse en función de una fecha determinada, como la fecha de vencimiento de la membresía, que debe ser exactamente un año a partir de la fecha de registro.

Otro ejemplo es calcular la fecha de finalización del curso, que debe ser exactamente dos meses después de la fecha de inicio del curso.

Definición de Microsoft

Esta función agrega un número especificado valor (como un entero con signo) a un datepart especificado de una fecha de entrada y luego devuelve ese valor modificado.

Compatibilidad

Según la documentación de Microsoft, esta función es compatible con las siguientes versiones de SQL Server:

  1. SQL Server 2008 más
  2. Base de datos Azure SQL
  3. Almacén de datos Azure SQL
  4. Almacén de datos en paralelo

Sintaxis

DATEADD (datepart, number, date)

Datepart es cualquier parte de la fecha, como día, mes, año, día de la semana, hora, etc.

El número es entonces el número de la parte de la fecha (día, mes, año, etc.) que se sumará o restará

La fecha es una fecha dada que debe agregarse o restarse usando la función DATEADD

Ejemplo 1:obtener la fecha del próximo año

Definamos también una fecha determinada (Fecha de registro) que se sumará o restará utilizando el DATEADD función basada en los requisitos.

La fecha del próximo año se puede obtener agregando 1 a la parte de la fecha del año.

Para obtener el próximo año a partir de la fecha de registro, simplemente agregamos DatePart Year seguido de 1 seguido de Fecha de registro (@RegistrationDate) en el DATEADD funcionan de la siguiente manera:

-- Define Registration Date
DECLARE @RegDate DATETIME2='2018-07-10'

-- Getting Next Year from registratoin date
SELECT DATEADD(YEAR,1,@RegDate) as NextYear_RegDate

Ejemplo 2:obtener la fecha del próximo mes

Para obtener la Fecha del próximo mes, pase el MES parte de la fecha del DATEADD función seguida del número de meses que queremos agregar seguido de la fecha dada que es la fecha de registro (RegDate) en nuestro caso.

-- Define Registration Date
DECLARE @RegDate DATETIME2='2018-07-10'
SELECT @RegDate AS RegDate -- Show Registration Date

-- Getting Next MONTH from the registratoin date
SELECT DATEADD(MONTH,1,@RegDate) as NextMonth_RegDate

Ejemplo 3:obtener la fecha del día siguiente

Si el curso comienza el siguiente (próximo) día de registro, necesitamos pasar DÍA con 1 ya que al día siguiente se suma otro día a la fecha de registro, lo cual se demuestra de la siguiente manera:

-- Define Registration Date
DECLARE @RegDate DATETIME2='2018-07-10'
SELECT @RegDate AS RegDate -- Show Registration Date

-- Getting Next DAY from registratoin date
SELECT DATEADD(DAY,1,@RegDate) as NextDAY_RegDate

Ejemplo 4:Configuración de la fecha del informe de ventas diarias

Ahora centrémonos en un escenario un poco complejo que se usa a menudo en el desarrollo de informes financieros diarios.

Si queremos crear un informe de ventas diario, debe mostrar los datos de ayer, ya que el día actual aún no está completo y el día completo más reciente es ayer, como se explica al principio de este artículo.

Al final, también necesitamos convertir la fecha y hora de ayer en valor de solo fecha para que sea más fácil que el informe cubra todo el día.

Para obtener la fecha de ayer basada en la fecha de hoy, debemos agregar "-1 día" a la fecha actual de la siguiente manera:

-- Define Current Date
DECLARE @CurrentDate DATETIME2=GETDATE()
SELECT @CurrentDate AS CurrentDate -- Show Registration Date

-- Getting Yesterday Date and Time from current date
SELECT DATEADD(DAY,-1,@CurrentDate) as YesterdayDateTime_CurrentDate

-- Converting Yesterday DateTime into Date only
SELECT CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)as YesterdayDateOnly_CurrentDate

Uso de la función DATEDIFF

Definición sencilla

La función DATEDIFF se utiliza para determinar la diferencia en días, meses, años, horas, etc. entre dos fechas.

Por ejemplo, podemos saber cuántos días han pasado entre dos fechas.

Esto también es muy útil en los escenarios en los que necesitamos investigar la diferencia entre la fecha de entrega del pedido prevista y la fecha de entrega real del pedido.

Otro ejemplo es el seguimiento del tiempo, lo que significa comprender cuántas horas se han dedicado a un proyecto en particular desde que comenzó hasta ahora.

Definición de Microsoft

Esta función devuelve el recuento (como un valor entero con signo) de los límites de parte de fecha especificados cruzados entre la fecha de inicio especificada y fecha de finalización .

Compatibilidad

Según la documentación de Microsoft, esta función es compatible con las siguientes versiones de SQL Server:

  1. SQL Server 2008 más
  2. Base de datos Azure SQL
  3. Almacén de datos Azure SQL
  4. Almacén de datos en paralelo

Sintaxis

DATEDIFF ( datepart , startdate , enddate )

Datepart es cualquier parte de la fecha, como día, mes, año, día de la semana, hora, etc.

Ejemplo 1:comprensión de la diferencia en días

Tratemos de entender cómo el DATEDIFF la función funciona.

Si tratamos de averiguar la diferencia en días entre el 1 de julio de 2018 y el 2 de julio de 2018, obtendremos 1 día, lo que significa que se resta la fecha de finalización de la fecha de inicio para obtener la diferencia:

SELECT DATEDIFF(DAY,'01 JULY 2018','02 JULY 2018') AS Days_Between_Two_Consecutive_Dates
SELECT DATEDIFF(DAY,'01 JULY 2018','03 JULY 2018') AS Days_Between_01_July_03_July

Ejemplo 2:Obtención de días entre el pedido y la entrega

Definamos dos fechas diferentes, Fecha de pedido y fecha de entrega, que se utilizará para determinar la diferencia en días, meses, años, horas, etc.

Para averiguar el número de días entre la fecha del pedido y la fecha de entrega, la parte de fecha DAY se pasa a DATEDIFF función seguida de Fecha de inicio (FechaPedido) y Fecha de finalización (Fecha de entrega) :

-- Define Order Date and Order Delivery Date
DECLARE @OrderDate DATETIME2='28 July 2018'
DECLARE @DeliveryDate DATETIME2='07 August 2018'

SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Show Order and Delivery Dates

-- Getting difference in days between order date and delivery date
SELECT DATEDIFF(DAY,@OrderDate,@DeliveryDate) as Days_Between_Order_and_Delivery

Ejemplo 3:Obtención de horas de proyecto (seguimiento de tiempo)

Este es un ejemplo interesante de seguimiento de tiempo usando la función DATEDIFF.

Por ejemplo, estamos interesados ​​en saber cuántos días en total y cuántos días en horas y días en minutos dedicamos a un proyecto en particular, y luego vamos a pasar primero la parte de la fecha del DÍA a la función DATEDIFF, donde la fecha de inicio es la la fecha en que comenzó el proyecto y la fecha de finalización es la fecha de hoy seguida de HORA y luego MINUTO de la siguiente manera:

-- Define Project Start Date
DECLARE @ProjectStartDate DATETIME2='10 Nov 2018'


SELECT @ProjectStartDate AS ProjectStartDate-- Show Project Start Date

-- Getting Number of days spent on the project so far
SELECT DATEDIFF(DAY,@ProjectStartDate,GETDATE()) as Project_Days_So_Far
-- Getting Number of hours spent on the project so far
SELECT DATEDIFF(HOUR,@ProjectStartDate,GETDATE()) as Project_Hours_So_Far
-- Getting Number of minutes spent on the project so far
SELECT DATEDIFF(MINUTE,@ProjectStartDate,GETDATE()) as Project_Minutes_So_Far

Felicitaciones, ha aprendido con éxito a usar las funciones DATEADD, DATEDIFF y DATEPART T-SQL.

Cosas que hacer

Ahora que está familiarizado con algunas funciones básicas de fecha, desafíese probando las cosas que se mencionan a continuación:

  1. Consulte mi artículo anterior Procedimientos de informes de pruebas unitarias:salte a Iniciar TDDD Parte 4 para configurar una base de datos SQLDevBlogReportTDD de muestra y luego cree una vista para averiguar la cantidad de meses en función de la fecha de registro del autor.
  2. Consulte mi artículo anterior Simplificación del procedimiento almacenado principal de pruebas unitarias que también llama a un procedimiento de utilidad para crear una base de datos SQLBookShop de muestra y agregar la Fecha de entrega columna a BookOrder y luego cree un nuevo procedimiento almacenado ProcessOrder que utiliza el DATEADD función para agregar la entrega prevista cinco días después de la fecha del pedido.
  3. Eche un vistazo a mi artículo anterior Saltar para comenzar el desarrollo de bases de datos basadas en pruebas (TDDD):parte 3 e intente crear un informe diario utilizando la función DATEADD T-SQL modificando los datos en la base de datos SQLDevBlogReportTDD de muestra para que hay suficientes datos para mostrar en el informe.