[Resolvido] Postgrees -Dúvidas em date e SQL-

Olá pessoal sou novato em desenvolvimento para web
estou com dúvidas em como lidar com o tipo date,
preciso inserir datas em algumas colunas da tabela
e em outras preciso apenas de inserir horas.
Se alguém tiver um exemplo, uma fonte em
que eu possa aprender por favor passa ai

você salvar o Date e em seguida recupera esse valor
Dá uma olhada nesse link:
http://www.guj.com.br/java/149-hora-e-data-como-posso-pegar

em java use:

java.util.Date date = new Date()

coluna no Postgres será:

data timestamp without time zone NOT NULL,

desta forma ele guardará no banco assim:

2011-05-26 17:29:00

sua aplicaçação é jsf?
se for, na hora de recuperar a data na tela pode formata-la da forma que quiser segue um exemplo:

<h:outputText value="#{obj.data}"> <f:convertDateTime pattern="dd/MM/yyyy - HH:mm" /> </h:outputText>

Ve se te ajuda!

Surgiu uma nova dúvida, olhem o metodo que salva o meu cliente no BD:

@Override
    public void salvarUsuario(Cliente usuario) {
       PreparedStatement ps = null;
        Connection conexao = null;
        try {
            String sql = "INSERT INTO usuario ( pnome, unome, endereco, estado, cidade, email, username, data_criacao_conta,"
                    + " telefone, senha, cep) "
                    + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            conexao = this.conexao;
            ps = conexao.prepareStatement(sql);
            ps.setString(1, usuario.getpNome());
            ps.setString(2, usuario.getuNome());
            ps.setString(3, usuario.getEndereco());
            ps.setString(4, usuario.getEstado());
            ps.setString(5, usuario.getCidade());
            ps.setString(6, usuario.getEmail());
            ps.setString(7, usuario.getLogin());
            ps.setDate(8,  usuario.getData_criacao());// aqui o metodo pes.setDate nao esta aceitando o meu parametro data_criacao que é um atributo do tipo Date da minha classe Cliente
            ps.setString(9, usuario.getTelefone());
            ps.setString(10, usuario.getSenha());
            ps.setString(11, usuario.getCep());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw e;
        } finally {
            Conexao.closeConnection(conexao, ps);
        }
    }

Agora o metodo que uso na classe de controle para salvar o cliente, aqui recebo todos os dados do cliente
da minha página jsf e crio um a date para saber a data de criação do meu cliente:

public String cadastraCliente() {
        try {
            ClienteDAO usrCad = new ClienteDAOImpl();
            this.cliente.setData_criacao(new Date());
            usrCad.salvarUsuario(this.getCliente());
        } catch (Exception e) {
            FacesContext contexto = FacesContext.getCurrentInstance();
            contexto.addMessage(null, new FacesMessage("Houve algum erro no cadastro."));
            return "Ncadastrado";
        }
        return "cadastrado";
    }

A principal dúvida agora é saber com mandar a Date para o BD.

ps.setDate(8,  new java.sql.Date(usuario.getData_criacao()) );

Faz assim.

Valeu pelo help pessoal eu encontrei uma solucao:
eu acabei confundindo o java.util.Date com o java.sql.Date, entao troquei o atributo
da classe Cliente por java.sql.Date e no dao ficou assim:

public void salvarUsuario(Cliente usuario) throws VooExceptions {
        PreparedStatement ps = null;
        Connection conexao = null;
        if (usuario == null) {
            throw new VooExceptions("Nenhum usuario foi informado!");
        }
        try {
            String sql = "INSERT INTO cliente ( pnome, unome, endereco, estado, cidade, email, username, data_criacao_conta,"
                    + " telefone, senha, cep) "
                    + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            conexao = this.conexao;
            ps = conexao.prepareStatement(sql);
            ps.setString(1, usuario.getPriNome());
            ps.setString(2, usuario.getLastNome());
            ps.setString(3, usuario.getEndereco());
            ps.setString(4, usuario.getEstado());
            ps.setString(5, usuario.getCidade());
            ps.setString(6, usuario.getEmail());
            ps.setString(7, usuario.getLogin());
            ps.setDate(8, usuario.getData_criacao());
            ps.setString(9, usuario.getTelefone());
            ps.setString(10, usuario.getSenha());
            ps.setString(11, usuario.getCep());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new VooExceptions("Houve algum erro no cadastro. " + e);
        } finally {
            try {
                Conexao.closeConnection(conexao, ps);
            } catch (Exception ex) {
                Logger.getLogger(ClienteDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Quando crio a conta do cliente eu utilizo o java.util.Date para saber a data da criacao e utilizo
o java.util.Date.getTime() para pegar a data em formato Long,
pois o construtor de java.sql.Date aceita apenas um argumento deste tipo ficou assim:

public String cadastraCliente() {
        try {
            ClienteDAO usrCad = new ClienteDAOImpl();
            java.util.Date data = new java.util.Date();
            java.sql.Date i = new Date( data.getTime() );
            this.cliente.setData_criacao( i );
            usrCad.salvarUsuario(this.getCliente());
        } catch (Exception e) {
            FacesContext contexto = FacesContext.getCurrentInstance();
            contexto.addMessage(null, new FacesMessage("Houve algum erro no cadastro." + e));
            return "Ncadastrado";
        }
        return "cadastrado";
    }

Muito Obrigado :smiley:

Amigo,
a maneira mais fácil que eu conheço de se registrar no banco o momento de criação de uma tupla qualquer é através de TIMESTAMP, que é um recurso do próprio SQL para este propósito. No meu script de criação da tabela no SQL está:

CREATE TABLE ...(... `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ...)

Setado desta forma, eu nem preciso incluir o campo data na minha query de fazer o INSERT. O banco já o preenche automaticamente no momento da inclusão da nova tupla com a data e hora atuais.

Com este código, você não precisa digitar absolutamente nada no seu sistema, o próprio SQL resolve sozinho a questão da data de criação do seu cliente.

A idéia do timestamp é legal mais infelizmente não vou poder utilizar,
pois é para um trabalho em grupo de BD e a na documentação que o
grupo fez e j[a entregou para a prof, da qual eu quase n fiz parte,
eles definiram o tipo como Date, agora eu tenho q usar T.T