Ayuda con indices en base de datos

Iniciado por Skeletron, 25 Octubre 2009, 22:22 PM

0 Miembros y 1 Visitante están viendo este tema.

seba123neo

Cita de: Skeletron en 27 Octubre 2009, 19:28 PM
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

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

^Tifa^

#21
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 :

Código (sql) [Seleccionar]


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  :-*

Skeletron

Cita de: seba123neo en 27 Octubre 2009, 23:51 PM
Cita de: Skeletron en 27 Octubre 2009, 19:28 PM
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



Lee 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!!!

Skeletron

#23
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:
Código (vbnet) [Seleccionar]
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?

^Tifa^

Disculpa que no te ayude mucho a estas horas.... es tarde, tengo un suenio enorme  :xD  y debo levantarme a las 5:30 am para el trabajo y ahora son las 12:34 am  :xD

CitarSupongamos 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).

Citarme 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  :xD te convendria mas usar SUBSTR por ejemplo.

Skeletron

#25
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)

Código (vbnet) [Seleccionar]
   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 :P)
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..

^Tifa^

#26
Valgame que pena que no se Visual Basic  :-(

Porque tu problemita lo analize, y lo resolvi pero en PERL  :-[

Código (perl) [Seleccionar]


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:

Citar
       
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.


seba123neo

Cita de: Skeletron en 28 Octubre 2009, 06:15 AM
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)

Código (vbnet) [Seleccionar]
   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 :P)
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...
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Skeletron

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 :P

Muy atareado con la facultad.. mucho estudio.. recien hoy me pongo con ésto..

Skeletron

Cita de: ^TiFa^ en 29 Octubre 2009, 04:26 AM
Valgame que pena que no se Visual Basic  :-(

Porque tu problemita lo analize, y lo resolvi pero en PERL  :-[

Código (perl) [Seleccionar]


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:

Citar
       
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 :/