package javacodebook.jdbc.datesntimes;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;

public class SQLDateAndTimeExample {

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            Statement statement = con.createStatement();

            // Erst einmal die Datenbank sauber machen
            statement.executeUpdate(
                "DELETE FROM employees WHERE id = 12");

            // Dann den Beispieldatensatz einfügen
            statement.executeUpdate(
                "INSERT INTO employees"
                    + "(id,firstname,lastname,since,starttime,"
                    + "lastaccess) VALUES (12,'Miriam','Bauman',"
                    + "'2001-02-01','10:00:00','2001-02-01 "
                    + "10:00:00.000')");

            // Im folgenden nutzen wir ein änderbares ResultSet.
            // Die hier verwendeten Methoden von ResultSet sind
            // analog zu denen von PreparedStatement
            statement =
                con.createStatement(
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
            // ...und selektieren den Beispieldatensatz
            ResultSet result =
                statement.executeQuery(
                    "SELECT * FROM employees WHERE id=12");
            result.first();

            // Dann testen wir mal alle möglichen Alternativen...
            System.out.println(
                "value of 'since' before: "
                    + result.getDate("since"));

            // java.sql.Date ist von java.util.Date abgeleitet,
            // kann also durch die Methoden von Calendar
            // verändert werden (siehe entsprechende Rezepte).
            // Gleiches gilt fuer Time und Timestamp

            // Date entspricht einem Kalendertag
            Date date = new Date(System.currentTimeMillis());
            result.updateDate("since", date);
            result.updateRow();
            System.out.println(
                "value of 'since' now: "
                    + result.getDate("since"));

            // Time ist eine Uhrzeit, aber ohne Tag
            System.out.println(
                "value of 'starttime' before: "
                    + result.getTime("starttime"));

            Time time = new Time(System.currentTimeMillis());
            result.updateTime("starttime", time);
            result.updateRow();
            System.out.println(
                "value of 'starttime' now: "
                    + result.getTime("starttime"));

            // Timestamp ist ein millisekundengenaue Zeitangabe
            System.out.println(
                "value of 'lastaccess' before: "
                    + result.getTimestamp("lastaccess"));

            Timestamp timestamp =
                new Timestamp(System.currentTimeMillis());
            result.updateTimestamp("lastaccess", timestamp);
            result.updateRow();
            System.out.println(
                "value of 'lastaccess' now: "
                    + result.getTimestamp("lastaccess"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
