Autor
|
Tema: Ayuda con indices en base de datos (Leído 18,116 veces)
|
seba123neo
|
Porque cuando le pongo formato DATE, y hago un select y me devuelve tambien la HORA.. (supongamos que inserte: 21-01-1990, me devuelve 21-01-1990 00:00:00) Y no quiero que sea así...
eso es obvio, pero en cualquier motor, ya sea SQL Server o SQL Lite podes formatear en el select para traer solo la fecha...o lo que quieras, solo es cuestion de investigar un poco, ¿no hay?...en 10 segundos encontre... Date And Time Functions
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Si SQLite tiene sus cositas personalizadas .... hay que pasarle formato por lo visto a los campos DATE en SQLite. Pero si se te complica mucho el asunto chico, crea el campo tipo DATE he inserta la fecha, como te decia si por cada registro de fecha que ingreses se te guardan asi: 1999-11-23 10:03:00 Utiliza para obtener los datos en una busquedad la funcion SUBSTR (Que asumo debe existir en SQLite) te mostrare un ejemplo en MySQL : mysql> SELECT * FROM ejemplo; +---------------------+ | fecha | +---------------------+ | 2009-11-22 00:00:00 | | 2006-10-30 00:00:00 | | 2001-08-23 00:00:00 | | 1998-10-29 00:00:00 | +---------------------+ 4 ROWS IN SET (0.00 sec) mysql> SELECT substr(fecha, 1, 10) FROM ejemplo WHERE fecha LIKE '2001-08-23%'; +----------------------+ | substr(fecha, 1, 10) | +----------------------+ | 2001-08-23 | +----------------------+ 1 ROW IN SET (0.00 sec) mysql> SELECT substr(fecha, 1, 10) FROM ejemplo WHERE fecha LIKE '1998-%-29%'; +----------------------+ | substr(fecha, 1, 10) | +----------------------+ | 1998-10-29 | +----------------------+ 1 ROW IN SET, 1 warning (0.00 sec)
No hay tunning ni optimizacion alguna en la consulta, es mas para que te sirva de referencia de como podrias buscar los datos en la tabla sin necesidad de que te devuelve el rango de fecha con la hora incluida. la funcion SUBSTR funciona SUBSTR(campo, desde, hasta) Siendo desde la ubicacion del registro donde se comenzara a contar y hasta, hasta donde se contara en el caso de una fecha: 1999-11-23 10:02:00 Desde el digito 1 hasta el 10 es '1999-11-23' Besos
|
|
« Última modificación: 28 Octubre 2009, 01:34 am por ^TiFa^ »
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Porque cuando le pongo formato DATE, y hago un select y me devuelve tambien la HORA.. (supongamos que inserte: 21-01-1990, me devuelve 21-01-1990 00:00:00) Y no quiero que sea así...
eso es obvio, pero en cualquier motor, ya sea SQL Server o SQL Lite podes formatear en el select para traer solo la fecha...o lo que quieras, solo es cuestion de investigar un poco, ¿no hay?...en 10 segundos encontre... Date And Time FunctionsLee bien lo que puesto.. dije que no hay EN CASTELLANO.. no soy muy bueno con el ingles... Y ahorita pruebo loq ue em dices Tifa.. Gracias!!!
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Perdon por armar tanto disturbio al pedo... Tal vez lo habia hecho mal anteriormente.. tal vez ponia datatime.... Hice lo siguiente: Cree la base con un Fecha DATE y luego: Public Class Form1 Private database As String = "C:\databaseprueba.db3" Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim SQLconnect As New SQLite.SQLiteConnection() Dim SQLcommand As SQLite.SQLiteCommand SQLconnect.ConnectionString = "Data Source=" & database & ";" SQLconnect.Open() SQLcommand = SQLconnect.CreateCommand 'Insert Record into Foo SQLcommand.CommandText = "INSERT INTO Prueba (Fecha) VALUES ('1991-02-22')" SQLcommand.ExecuteNonQuery() SQLcommand.Dispose() SQLconnect.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim SQLconnect2 As New SQLite.SQLiteConnection() Dim SQLcommand2 As SQLite.SQLiteCommand SQLconnect2.ConnectionString = "Data Source=" & database & ";" SQLconnect2.Open() SQLcommand2 = SQLconnect2.CreateCommand SQLcommand2.CommandText = "SELECT * FROM Prueba" Dim SQLreader2 As SQLite.SQLiteDataReader = SQLcommand2.ExecuteReader() While SQLreader2.Read() MsgBox(SQLreader2(0)) End While SQLcommand2.Dispose() SQLconnect2.Close() End Sub End Class
Y perfectamente me mostró la fecha así: 22/02/1991 Muchisimas gracias!!!!! Entonces ahora volviendo al tema... me recomiendas hacer un INDICE en el nuevo campo FECHA, y realizar una busqueda concatenando el dia con el mes... Tendré que ponerle a todas las fechas el año 0000.. porque son efemerides.. se supone que no importa en que año fueron.. (aunque se detalla en el texto).. Gracias a todos che.. como siempre, un AGRADO MUY GRANDE el aprendender con ustedes! PD.: Agrego algo: para hacer una busqueda, hay que escribirla de esta manera: "SELECT * FROM Prueba WHERE Fecha='1990-01-21'", y no como muestra el resultado (21/01/1990) Y pregunto algo mas.. Supongamos que hago un INDICE así. CREATE INDEX indice ON Prueba(Fecha) Luego al hacer un SELECT, no tengo que poner el nombre del indice no?? tengo que seguir usando el "Prueba" como "nombre de columna"... o me equivoco?
|
|
« Última modificación: 28 Octubre 2009, 05:33 am por Skeletron »
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Disculpa que no te ayude mucho a estas horas.... es tarde, tengo un suenio enorme y debo levantarme a las 5:30 am para el trabajo y ahora son las 12:34 am Supongamos que hago un INDICE así. CREATE INDEX indice ON Prueba(Fecha) Luego al hacer un SELECT, no tengo que poner el nombre del indice no?? tengo que seguir usando el "Prueba" como "nombre de columna"... o me equivoco? No, no tienes que colocar el nombre del indice, dicho nombre es solo para guardarlo en el diccionario de la DB donde se reflejan todos los indices, de todas las tablas y bajo que usuario (En caso que quieras hacer una busquedad bajo nombre del indice para averiguar a que tabla, usuario, instancia pertenece lo cual no es tu caso). me recomiendas hacer un INDICE en el nuevo campo FECHA, y realizar una busqueda concatenando el dia con el mes... No debes concatenar ahora, recuerda que la fecha viene ahora en 1 solo formato y pegado te convendria mas usar SUBSTR por ejemplo.
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
No no.. me referia a que tendre que concatenar porque: Tengo 12 carpetas, y dentro de cada carpeta tengo 31 archivos de texto con cada linea una entrada para la base de datos.. entonces hago lo sigueinte: (aunque se me presento otro problema.. leer debajo de todo) Private Sub INSERTAR(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim conexión As New SQLite.SQLiteConnection() Dim Consulta As SQLite.SQLiteCommand Dim linea As String = "" conexión.ConnectionString = "Data Source=" & Database & ";" conexión.Open() Consulta = conexión.CreateCommand For Mess As Integer = 1 To 2 '12 For Diaa As Integer = 1 To 2 '31 Dim Lectura As StreamReader = New StreamReader("C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\" & Mess & "\" & Diaa & ".txt", System.Text.Encoding.Default, False) While True linea = Lectura.ReadLine If linea = "" Then Exit While End If linea = linea.Replace("'", "-") linea = linea.Replace("\", "") linea = linea.Replace("""", "-") Consulta.CommandText = "INSERT INTO Efemerides (Fecha, Texto, Version) VALUES ('0000-" & Mess & "-" & Diaa & "', '" & linea & "', '1')" Consulta.ExecuteNonQuery() End While Lectura.Dispose() Lectura.Close() Next MsgBox("Fin de mes") Next Consulta.Dispose() conexión.Close() MsgBox("Listo") End Sub
Como veran, leo éste archivo: C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\0" & Mess & "\" & Diaa & ".txt" Que segun los valores de los FOR, entraré al 1º dia del 1º mes: C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\1\1.txt" E insertará la 1º linea de ese archivo.. y colocará en la fecha de ingreso: 0000-1-1 Como hago para que ese 0000-1-1 pase a ser 0000-01-01 ??? porque aunque no lo crean, da error en el formato data al hacer el Select :O Las carperas van del 01 al 012 (era así porque en su momento RIPWAY no me permitia nombre tan corto en carpeta ) Y los archivos, del 1 al 31 Cambiarle el nombre a las carpetas, es facil... le pongo del 01 al 12 si quiero.. pero que hago con los archivos??? Capaz tenga que jugar un poco con acumuladores.. y problema solucionado.. ya vere que ahgo..
|
|
« Última modificación: 28 Octubre 2009, 06:20 am por Skeletron »
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Valgame que pena que no se Visual Basic Porque tu problemita lo analize, y lo resolvi pero en PERL for ( my $mes = 1; $mes <= 12; $mes++ ) { for ( my $dia = 1; $dia <= 31; $dia++ ) { if ( $mes <= 9 && $dia <= 9 ) { print STDOUT "0000-" . '0' . $mes . "-" . '0' . $dia . "\n"; next; } print STDOUT "0000-" . $mes . "-" . $dia . "\n"; } };
Lo cual al ejecutar me imprime: 0000-09-01 0000-09-02 0000-09-03 0000-09-04 0000-09-05 0000-09-06 0000-09-07 0000-09-08 0000-09-09
Obviamente la condicion se cumple en mes y dia con un cero de primera, siempre y cuando tanto mes como dia sean igual o menor que 9 puedes hacerlo esto solo es una idea de que podrias hacer para tu problemita. Los puntitos que vez en los PRINT son 'concatenar' si te sirve puedes analizarlo, echarle mas logica y hacer eso bucles for con condiciones si se cumple tal cosa concatename cero en dia y mes, sino se cumple quitamele el cero.
|
|
« Última modificación: 29 Octubre 2009, 04:36 am por ^TiFa^ »
|
En línea
|
|
|
|
seba123neo
|
No no.. me referia a que tendre que concatenar porque: Tengo 12 carpetas, y dentro de cada carpeta tengo 31 archivos de texto con cada linea una entrada para la base de datos.. entonces hago lo sigueinte: (aunque se me presento otro problema.. leer debajo de todo) Private Sub INSERTAR(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim conexión As New SQLite.SQLiteConnection() Dim Consulta As SQLite.SQLiteCommand Dim linea As String = "" conexión.ConnectionString = "Data Source=" & Database & ";" conexión.Open() Consulta = conexión.CreateCommand For Mess As Integer = 1 To 2 '12 For Diaa As Integer = 1 To 2 '31 Dim Lectura As StreamReader = New StreamReader("C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\" & Mess & "\" & Diaa & ".txt", System.Text.Encoding.Default, False) While True linea = Lectura.ReadLine If linea = "" Then Exit While End If linea = linea.Replace("'", "-") linea = linea.Replace("\", "") linea = linea.Replace("""", "-") Consulta.CommandText = "INSERT INTO Efemerides (Fecha, Texto, Version) VALUES ('0000-" & Mess & "-" & Diaa & "', '" & linea & "', '1')" Consulta.ExecuteNonQuery() End While Lectura.Dispose() Lectura.Close() Next MsgBox("Fin de mes") Next Consulta.Dispose() conexión.Close() MsgBox("Listo") End Sub
Como veran, leo éste archivo: C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\0" & Mess & "\" & Diaa & ".txt" Que segun los valores de los FOR, entraré al 1º dia del 1º mes: C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\1\1.txt" E insertará la 1º linea de ese archivo.. y colocará en la fecha de ingreso: 0000-1-1 Como hago para que ese 0000-1-1 pase a ser 0000-01-01 ??? porque aunque no lo crean, da error en el formato data al hacer el Select :O Las carperas van del 01 al 012 (era así porque en su momento RIPWAY no me permitia nombre tan corto en carpeta ) Y los archivos, del 1 al 31 Cambiarle el nombre a las carpetas, es facil... le pongo del 01 al 12 si quiero.. pero que hago con los archivos??? Capaz tenga que jugar un poco con acumuladores.. y problema solucionado.. ya vere que ahgo.. con un simple Format() se soluciona...
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Utilizando el PARSE: Date.Parse("0000-1-2"), NO funciona, pero con: Date.Parse("1111-1-2") ya funciona... es como que en el Parseado, no puede parsear un año=0000 Dato importante para la comunidad Muy atareado con la facultad.. mucho estudio.. recien hoy me pongo con ésto..
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Valgame que pena que no se Visual Basic Porque tu problemita lo analize, y lo resolvi pero en PERL for ( my $mes = 1; $mes <= 12; $mes++ ) { for ( my $dia = 1; $dia <= 31; $dia++ ) { if ( $mes <= 9 && $dia <= 9 ) { print STDOUT "0000-" . '0' . $mes . "-" . '0' . $dia . "\n"; next; } print STDOUT "0000-" . $mes . "-" . $dia . "\n"; } };
Lo cual al ejecutar me imprime: 0000-09-01 0000-09-02 0000-09-03 0000-09-04 0000-09-05 0000-09-06 0000-09-07 0000-09-08 0000-09-09
Obviamente la condicion se cumple en mes y dia con un cero de primera, siempre y cuando tanto mes como dia sean igual o menor que 9 puedes hacerlo esto solo es una idea de que podrias hacer para tu problemita. Los puntitos que vez en los PRINT son 'concatenar' si te sirve puedes analizarlo, echarle mas logica y hacer eso bucles for con condiciones si se cumple tal cosa concatename cero en dia y mes, sino se cumple quitamele el cero. El problema de ésto, es que con el mes: 10, 11, y 12, pasará el valor: 011, 012... y no lo tomará como un DATE :/
|
|
|
En línea
|
|
|
|
|
|