-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path03-fechas-funciones.sql
More file actions
275 lines (199 loc) · 11.1 KB
/
03-fechas-funciones.sql
File metadata and controls
275 lines (199 loc) · 11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
--- FUNCIONES DE FECHA ===============================================================
-- TIPOS DE DATOS
---- NUMÉRICO: INT , NUMERIC , DECIMAL , FLOAT , BIGINT , SMALLINT
---- TEXTO: VARCHAR , NVARCHAR , CHAR
---- FECHA: DATE , DATETIME
--- GETDATE()------------------------------------------------------------------------------------------------
SELECT GETDATE() --- DATETIME, devuelve DATE-fecha y TIME-hora
SELECT GETDATE() - 1 --- ES LA RESTA DE DIAS, es bueno porque es simple
--- uso de CAST (OBTENEMOS EL DATE, no DATETIME)
SELECT cast( GETDATE() as date) --- conversion simple
SELECT cast('20250311' as date) --- es un numero pero es compatible porque hace date lo hace 2025-03-11
--- uso de convert
SELECT convert(date , '20250311' , 112 ) --- conversion con formato
--- para esto se usa una tabla de conversion que se busca en google: 112 o 12 (yyyymmdd), ...
--- DATEADD(tipo de intervalo, numero, fecha)----------------------------------------------------------------
SELECT DATEADD(day , 1, GETDATE())
SELECT DATEADD(dd , +1, '20250311') --es preferible este porque después se usar mas dd, mm, ...
SELECT DATEADD(month , +1, GETDATE())
SELECT DATEADD(mm , +1, '20250311')
SELECT DATEADD(mm , -1, '20250331') --NOTA: aquí le reste un mes (resto 31 días), pero como el mes anterior es febrero, lo lleva al 28 como ultimo dia
SELECT DATEADD(mm , +1, '20250228') --NOTA: aquí le sume un mes (sumo 28 días), pero como el mes actual es febrero, lo lleva al 28 como ultimo dia
SELECT DATEADD(year ,+1, GETDATE())
SELECT DATEADD(yy , +1, '20250311')
SELECT DATEADD(day ,-1, GETDATE())
SELECT DATEADD(dd , -1, '20250311')
SELECT DATEADD(month , -1, GETDATE())
SELECT DATEADD(mm , -1, '20250311')
SELECT DATEADD(HOUR , +1, GETDATE())
SELECT DATEADD(HH , +1, '20250311') --en este caso es preferible getdate(), sino seria colocar '2025-03-11 00:00:00', muy especifico o tedioso
SELECT DATEADD(MINUTE , +1, GETDATE())
SELECT DATEADD(MM , 1, '20250311') --en este caso es preferible getdate(), sino seria colocar '2025-03-11 00:00:00', muy especifico o tedioso
--- DATEDIFF(tipo de intervalo, fecha 1, fecha 2)------------------------------------------------------------
SELECT datediff(YEAR , '19870201', GETDATE())
SELECT datediff(MONTH , '19870201', GETDATE())
SELECT datediff(dd , '19870201', GETDATE())
---SELECT datediff(dd , GETDATE(), '20250311')---en este caso da en negativo, esta mal en resumen
--- DATEPART(tipo de intervalo, fecha)------------------------------------------------------------
SELECT YEAR(GETDATE())
SELECT MONTH(GETDATE())
SELECT DAY(GETDATE())
--- es necesario el datepart para cuestiones de HOUR, MINUTE, SECOND, MILLISECOND, ...
--- también puedes usarlo con YEAR, MONTH, DAY aunque no es necesario
SELECT DATEPART(YEAR,GETDATE())
SELECT DATEPART(MONTH,GETDATE())
SELECT DATEPART(DAY,GETDATE())
SELECT DATEPART(HOUR,GETDATE())
SELECT DATEPART(MINUTE,GETDATE())
SELECT DATEPART(SECOND,GETDATE())
SELECT DATEPART(MILLISECOND,GETDATE())
--- con un solo SELECT se puede llamar a varios,deespues le haces columna si quieres...
SELECT DATEPART(HOUR,GETDATE()) , DATEPART(MINUTE,GETDATE())
--- EOMONTH(fecha)------------------------------------------------------------------------------------------------
PRINT DAY(EOMONTH('20250301'))
SELECT DAY(EOMONTH('20250301'))
--- FORMAT(fecha, formato)------------------------------------------------------------------------------------------------
PRINT FORMAT(cast('20250311' as date), 'yyyy*_*MM*_*dd') --- CONVIERTE A TEXTO, NECESITA UN FORMATO
PRINT FORMAT(getdate(), 'yyyy-MM-dd') --- CONVIERTE A TEXTO, NECESITA UN FORMATO
SELECT FORMAT(getdate(), 'yyyy*_*MM*_*dd')
--genera el periodo de la fecha actual : 202503
PRINT FORMAT(cast('20250311' as date), 'MM-yyyy') --- CONVIERTE A TEXTO, NECESITA UN FORMATO
PRINT FORMAT(getdate(), 'MM-yyyy') --- CONVIERTE A TEXTO, NECESITA UN FORMATO
--genera el dia 1 del mes actual : 20250301
PRINT FORMAT(cast('2025-03-11' as date), 'yyyyMM01') --- CONVIERTE A TEXTO, NECESITA UN FORMATO
--
PRINT cast(FORMAT(cast('20250311' as date), 'yyyyMM01') as date) --- CONVIERTE A TEXTO, NECESITA UN FORMATO
PRINT cast(FORMAT(getdate(), 'yyyyMM01') as date) --- CONVIERTE A TEXTO, NECESITA UN FORMATO
SELECT dateadd(day, -(DAY('20250321')-1) , cast('20250321' as date) ) ----- forma mas compleja haciendo calculos raros, el de arriba es mas optimo con cast y format
--- DATENAME(tipo de intervalo, fecha)------------------------------------------------------------------------------------------------
SELECT DATENAME(DAYOFYEAR, GETDATE());
SELECT DATENAME(WEEK, GETDATE()); --numero de semana
SELECT DATENAME(WEEKDAY, GETDATE());
SELECT DATENAME(MONTH, GETDATE());
SELECT DATENAME(YEAR, GETDATE());
-- es superado por format
print FORMAT(cast('2025-03-11' as date) , 'ddd' ) --arroja el formato corto en letras
print FORMAT(cast('2025-03-11' as date) , 'dddd' ) --arroja el formato largo en letras
print FORMAT(cast('2025-03-11' as date) , 'mmm' ) --arroja el formato corto en letras
print FORMAT(cast('2025-03-11' as date) , 'mmmm' ) --arroja el formato largo en letras
-- para yyyy no funciona como tal al parecer, o saldría lo mismo
--- ISDATE(expresión)------------------------------------------------------------------------------------------------
SELECT ISDATE('2025-02-28');
--- 0 es No, 1 es Si
-----------------------------------PRACTICAR----------------------------------------
-- conociendo las tablas
SELECT top 1000 * from OFERTAS
SELECT top 1000 * from GESTION_DETALLE
SELECT top 1000 * from GESTION
SELECT top 1000 * from COLABORADORES
SELECT top 1000 * from AGENCIAS
SELECT TOP 100 NumDoc, DATEDIFF(yy, FechaRegistroGestion, GETDATE())
FROM OFERTAS
WHERE FechaRegistroGestion is not null
---- cuales son los periodos que existen en la tabla ofertas --- PeriodoVigencia
SELECT DISTINCT Periodovigencia
from OFERTAS
---- cuales son los productos que existen en la tabla ofertas --- codigo_producto
SELECT DISTINCT codigo_producto
from OFERTAS
------------------conteo de ofertas entre 3 meses-----------------------------
-- primero:
SELECT MIN(FechaRegistroGestion) , MAX(FechaRegistroGestion) from OFERTAS
-- 2021-05-07 12:12:00 2023-09-01 19:10:00
SELECT COUNT(*) from OFERTAS
where cast(FechaRegistroGestion as date) >= '20210501' and cast( FechaRegistroGestion as date) <= '20230901'
-- NOTA MUY IMPORTANTE:
-- se usa el cast (... as date) porque sino no se toma todos los registros, es decir, si hubo un registro el 202408 a las 01:00:00 no contaria
-- porque sin el cast, solo se cuenta hasta las 00:00:00, asi que es preferible contar las de todo el dia, es decir, USAR EL CAST
-- sin cast: 160 916
-- con cast: 161 559
SELECT COUNT(*) from OFERTAS
where cast(FechaRegistroGestion as date) between '20210501' and '20230901'
-- NOTA MUY IMPORTANTE (se repite la explicación):
-- se usa el cast (... as date) porque sino no se toma todos los registros, es decir, si hubo un registro el 202408 a las 01:00:00 no contaria
-- porque sin el cast, solo se cuenta hasta las 00:00:00, asi que es preferible contar las de todo el dia, es decir, USAR EL CAST
-- sin cast: 160 916
-- con cast: 161 559
-- practica agregando 3 meses mas
SELECT COUNT(*) from OFERTAS
where cast(FechaRegistroGestion as date) between '20210501' and dateadd(mm,+3,'20210501')
-- practica agregando 1 anio mas
SELECT COUNT(*) from OFERTAS
where cast(FechaRegistroGestion as date) between '20210501' and dateadd(yy,+1,'20210501')
-- DUDA de un compañera sobre como saber días hábiles de lunes a viernes
-- id , fechaCierre , fechaProceso...... diahabil
------por transcurridos
-- 03-03 --.....04.03........1
-- 04-03--------------------------2
-- 21
-- 01-04 --.....02.04........1
-- 02-04--------------------------2
-- 21
------por transcurrir
--print datepart(weekday,'20250311')
--------cuantos periodos se tienen a razon de la Fecha de registro de gestion---------------
-- periodo = mes y el anio
SELECT distinct format(FechaRegistroGestion, 'yyyyMM') from OFERTAS
where FechaRegistroGestion is not null
-- ============================================================================
-- Tarea Instrucciones:
-- Realicen una exploraci�n de cada tabla y generen 2 consultas por cada una.
-- Cada consulta debe incluir al menos 2 condiciones.
-- ============================================================================
-- ===========================================================================================
-- 1. Tabla: Ofertas
-- ===========================================================================================
-- Exploraci�n: mostrar los primeros registros
SELECT TOP 30 * FROM Ofertas
-- Consulta 1: listar las l�neas �nicas de las ofertas
SELECT DISTINCT Linea
FROM Ofertas
WHERE Linea is not Null AND Tasa >= 12
-- Consulta 2: Calcular la duraci�n de las ofertas considerando el plazo
SELECT id, FechaInicio, FechaFin,
DATEDIFF(DAY, FechaInicio, FechaFin) AS Duracion_Dias, Plazo, NivelRiesgo
FROM Ofertas
WHERE Plazo IS NOT NULL AND CAST(NivelRiesgo AS FLOAT) > 0.1
-- ===========================================================================================
-- 2. Tabla: Colaboradores
-- ===========================================================================================
-- Exploraci�n: Mostrar los primeros registros
SELECT TOP 30 * FROM Colaboradores
-- Consulta 1: listar las agencias �nicas en la tabla
SELECT DISTINCT AGENCIA
FROM Colaboradores
WHERE AGENCIA IS NOT NULL AND ESTADO = 'A'
-- Consulta 2: Extraer el a�o de las fechas relacionadas con los colaboradores
SELECT id, NOMBRE, NACIONALIDAD,
DATEPART(YEAR, FECHAREGISTRO) AS Año_Registro, DATEPART(YEAR, FechaREG) AS Año_FechaREG
FROM Colaboradores
WHERE NACIONALIDAD = 'peruano' AND FECHAREGISTRO IS NOT NULL
-- Nota: en este ejercicio solo hay 1 registro con fecha en toda la tabla
-- ===========================================================================================
-- 3. Tabla: Agencias
-- ===========================================================================================
-- Exploraci�n: mostrar los primeros registros
SELECT TOP 30 * FROM Agencias
-- Consulta 1: listar los clusters �nicos de las agencias
SELECT DISTINCT AGENCIA
FROM Agencias
WHERE GERENTE_REGIONAL IS NOT NULL AND GERENTE_AGENCIA IS NOT NULL
-- Consulta 2: C�lculo basado en fecha actual con DATEADD
SELECT AGENCIA, FechaApertura,
DATEADD(mm, +6, FechaApertura) as Proxima_Evaluacion
FROM Agencias
WHERE FechaApertura IS NOT NULL AND GERENTE_AGENCIA IS NOT NULL
-- ===========================================================================================
-- 4. Tabla: Gesti�n
-- ===========================================================================================
-- Exploraci�n: mostrar los primeros registros
SELECT TOP 30 * FROM Gestion
-- Consulta 1: listar los tel�fonos �nicos que gestionaron ofertas
SELECT DISTINCT TelefonoRegistrado
FROM Gestion
WHERE TelefonoRegistrado IS NOT NULL AND EstadoGestion = 'Aceptada'
-- Consulta 2: calcular la diferencia de d�as entre dos fechas de gestiones
SELECT Numdoc, FechaRegistro, FechaVolverLllamar,
DATEDIFF(DAY, FechaRegistro, FechaVolverLllamar) AS Diferencia_Dias
FROM Gestion
WHERE FechaRegistro IS NOT NULL AND FechaVolverLllamar IS NOT NULL