[SQL] 안드로이드 SQLite는의 날짜와 작업에 가장 좋은 방법은 [마감]
SQL안드로이드 SQLite는의 날짜와 작업에 가장 좋은 방법은 [마감]
내가 SQLite는을 사용하여 내 안드로이드 응용 프로그램에 날짜와 함께 작업 몇 가지 문제가 있어요. 나는 몇 가지 질문이있다 :
해결법
-
==============================
1.당신은 SQLite는 내 날짜를 저장하기 위해 텍스트 필드를 사용할 수 있습니다.
당신은 SQLite는 내 날짜를 저장하기 위해 텍스트 필드를 사용할 수 있습니다.
날짜 열을 기준으로 다음 정렬 수 UTC 형식으로 날짜를 저장, 기본 당신은 날짜 ( '지금') (SS : mm YYYY-MM-DD HH)를 사용하는 경우.
일정 또는 android.text.format.DateUtils.formatDateTime 방법을 사용하여 로컬 regionalised 형식으로 필요에 따라 SQLite는에서 문자열은 다음 형식 / 변환 할 수 있습니다으로 날짜를 가져.
여기 내가 사용하십시오 regionalised 포맷 방법이다;
public static String formatDateTime(Context context, String timeToFormat) { String finalDateTime = ""; SimpleDateFormat iso8601Format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date date = null; if (timeToFormat != null) { try { date = iso8601Format.parse(timeToFormat); } catch (ParseException e) { date = null; } if (date != null) { long when = date.getTime(); int flags = 0; flags |= android.text.format.DateUtils.FORMAT_SHOW_TIME; flags |= android.text.format.DateUtils.FORMAT_SHOW_DATE; flags |= android.text.format.DateUtils.FORMAT_ABBREV_MONTH; flags |= android.text.format.DateUtils.FORMAT_SHOW_YEAR; finalDateTime = android.text.format.DateUtils.formatDateTime(context, when + TimeZone.getDefault().getOffset(when), flags); } } return finalDateTime; }
-
==============================
2.가장 좋은 방법은 달력 명령을 사용하여받은 숫자로 날짜를 저장하는 것입니다.
가장 좋은 방법은 달력 명령을 사용하여받은 숫자로 날짜를 저장하는 것입니다.
//Building the table includes: StringBuilder query=new StringBuilder(); query.append("CREATE TABLE "+TABLE_NAME+ " ("); query.append(COLUMN_ID+"int primary key autoincrement,"); query.append(COLUMN_DATETIME+" int)"); //And inserting the data includes this: values.put(COLUMN_DATETIME, System.currentTimeMillis());
이 왜? 우선, 날짜 범위에서 값을 얻는 것은 쉽다. 그냥 쿼리를 적절하게 다음 밀리 초 단위로 날짜를 변환합니다. 날짜별로 정렬하면 유사 쉽다. 내가 포함 등 다양한 포맷 간의 변환하는 호출은, 마찬가지로 쉽게도 있습니다. 결론은이 방법으로, 당신은 당신이 할 아무런 문제가 필요하지 무엇이든 할 수있다. 원시 값을 읽을 약간 어려울 수 있지만, 더 머신 쉽게 읽을 수 및 사용할 수있는과 그 약간의 단점 구성하는 것보다됩니다. 그리고 사실, 그것은 상대적으로 쉽게 독자를 구축하는 것입니다 (그리고 일부가 거기 알고) 자동으로 읽기 쉽게하기위한 같은 날짜에 시간 태그를 변환 할 것이다.
이 나올 값이 긴 int로하지해야한다는 언급 그것의 가치. SQLite는의 정수 1 ~ 8 바이트에서 많은 것을, 아무 의미도 있지만, 거의 모든 날짜 64 비트, 또는 오랫동안 작품, 무엇을 할 수 있습니다.
편집 : 바와 같이 의견에서 지적하고있다, 당신은이 작업을 수행 할 경우 제대로 타임 스탬프를 얻기 위해 cursor.getLong ()를 사용합니다.
-
==============================
3.항상 기본 (즉 장치의) 시간대를 사용하는 java.util.Calendar 및 java.text.SimpleDateFormat에 작업 특히 때 UTC / GMT 시간을 저장해야합니다. java.util.Date.Date ()는 그것이 UTC 값을 생성으로 사용하는 것이 안전합니다.
항상 기본 (즉 장치의) 시간대를 사용하는 java.util.Calendar 및 java.text.SimpleDateFormat에 작업 특히 때 UTC / GMT 시간을 저장해야합니다. java.util.Date.Date ()는 그것이 UTC 값을 생성으로 사용하는 것이 안전합니다.
-
==============================
4.SQLite는 실제 또는 저장 기간에 대한 데이터 유형 정수, 텍스트를 사용할 수 있습니다. 쿼리를 수행 할 때마다 더욱, 그 결과를 포맷을 사용하여 나타낸다 % Y- % M- % D % H % M : %의 S.
SQLite는 실제 또는 저장 기간에 대한 데이터 유형 정수, 텍스트를 사용할 수 있습니다. 쿼리를 수행 할 때마다 더욱, 그 결과를 포맷을 사용하여 나타낸다 % Y- % M- % D % H % M : %의 S.
당신이 SQLite는 날짜 / 시간 함수를 사용하여 / 업데이트 날짜 / 시간 값을 삽입 할 경우 지금, 당신은 실제로 밀리 초를 저장할뿐만 아니라 수 있습니다. 그런 경우, 그 결과를 포맷을 사용하여 나타낸다 % Y- % M- % D % H % M : %의 F. 예를 들면 :
sqlite> create table test_table(col1 text, col2 real, col3 integer); sqlite> insert into test_table values ( strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') ); sqlite> insert into test_table values ( strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'), strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126') ); sqlite> select * from test_table; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
우리가 실제로 시간을 비교할 수 있다면 이제, 일부 쿼리를 수행하면 확인합니다 :
sqlite> select * from test_table /* using col1 */ where col1 between strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.121') and strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125'); 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
당신은 COL2와 COL3를 사용하여 동일한 SELECT를 확인하실 수 있습니다 동일한 결과를 얻을 수 있습니다. 당신이 볼 수 있듯이, 두 번째 행 (126 밀리 초) 반환되지 않습니다.
BETWEEN 따라서 포함입니다 주 ...
sqlite> select * from test_table where col1 between /* Note that we are using 123 milliseconds down _here_ */ strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') and strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
... 동일한 집합을 반환합니다.
다른 날짜 / 시간 범위로 장난 시도하고 모든 것이 예상대로 동작합니다.
의 strftime 기능이없는 무엇에 대해?
sqlite> select * from test_table /* using col1 */ where col1 between '2014-03-01 13:01:01.121' and '2014-03-01 13:01:01.125'; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
의 strftime 기능없이 밀리없이 무엇에 대해?
sqlite> select * from test_table /* using col1 */ where col1 between '2014-03-01 13:01:01' and '2014-03-01 13:01:02'; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
무엇 ORDER BY에 대해?
sqlite> select * from test_table order by 1 desc; 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 sqlite> select * from test_table order by 1 asc; 2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123 2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
잘 작동합니다.
마지막으로, 프로그램 내에서 실제 작업을 처리 할 때 (SQLite는 실행 파일을 사용하지 않고 ...)
BTW : 나는 xerial에서 ... (하지 않도록 다른 언어에 대한) SQLite는-JDBC 드라이버 v3.7.2을 JDBC를 사용하고 있습니다 - 아마 새로운 버전이 동작은 아래에 설명 변경 ... 당신이 안드로이드 개발하는 경우, 당신은 JDBC 드라이버가 필요하지 않습니다. 모든 SQL 작업은 SQLiteOpenHelper를 사용하여 제출 할 수있다.
java.sql.Date, java.sql.Time 오브젝트와의 java.sql.Timestamp : JDBC 데이터베이스에서 실제 날짜 / 시간 값을 얻을 수있는 다른 방법이있다.
java.sql.ResultSet의 종래의 방법은 (명백하게) GETDATE (..), 다음 getTime (...) 및 getTimestamp () 각각.
예를 들면 :
Statement stmt = ... // Get statement from connection ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_TABLE"); while (rs.next()) { System.out.println("COL1 : "+rs.getDate("COL1")); System.out.println("COL1 : "+rs.getTime("COL1")); System.out.println("COL1 : "+rs.getTimestamp("COL1")); System.out.println("COL2 : "+rs.getDate("COL2")); System.out.println("COL2 : "+rs.getTime("COL2")); System.out.println("COL2 : "+rs.getTimestamp("COL2")); System.out.println("COL3 : "+rs.getDate("COL3")); System.out.println("COL3 : "+rs.getTime("COL3")); System.out.println("COL3 : "+rs.getTimestamp("COL3")); } // close rs and stmt.
SQLite는 실제 날짜 / 시간을 가지고 있지 않기 때문에 / TIMESTAMP 데이터는 객체가 0으로 초기화 것처럼이 모든 방법에는 3 값을 반환 입력 :
new java.sql.Date(0) new java.sql.Time(0) new java.sql.Timestamp(0)
그래서, 질문은 우리가 실제로 삽입 또는 갱신 날짜 / 시간 / 타임 스탬프 개체를 선택할 수 있습니까? 쉬운 답은 없다. 서로 다른 조합을 시도 할 수 있지만 모든 SQL 문에 포함 SQLite는 기능에 강제 할 것이다. 그것은 당신의 자바 프로그램 내에서 날짜 개체에 텍스트를 변환하는 유틸리티 클래스를 정의하는 것이 훨씬 쉽다. 그러나 항상 SQLite는이 UTC + 0000에 대한 날짜 값을 변환 기억 해요.
요약하면, 일반적에도 불구하고 항상 올바른 데이터 유형 또는 유닉스 시간 (에폭 (epoch) 이후 밀리 초)을 나타내는, 심지어 정수를 사용하려면, 나는 기본 SQLite는 형식 ( '% Y- % M- % D % H를 사용하여 훨씬 쉽게 찾을 수 있습니다 : %의 M : % f를 '또는 Java로'YYYY-MM-DD HH : mm : ss.SSS ')은 오히려 SQLite는 기능을 가진 모든 SQL 문을 복잡하게합니다. 이전 방식은 유지하기가 훨씬 쉽다.
TODO : (더 나은 API15 또는) 안드로이드 내부 GETDATE / 다음 getTime / getTimestamp를 사용할 때 나는 ... 결과를 확인합니다 어쩌면 내부 드라이버 SQLite는-JDBC 다른 ...
-
==============================
5.(나는 MySQL은 / 포스트 그레스에서와 같은) 보통 나는 INT (MySQL은 / 포스트) 또는 타임 스탬프 형식으로 저장할 수있는 텍스트 (SQLite는)의 날짜를 저장합니다.
(나는 MySQL은 / 포스트 그레스에서와 같은) 보통 나는 INT (MySQL은 / 포스트) 또는 타임 스탬프 형식으로 저장할 수있는 텍스트 (SQLite는)의 날짜를 저장합니다.
그럼 난 Date 객체로 변환하고 사용자의 시간대에 따라 작업을 수행합니다
-
==============================
6.SQLite는 DB에 데이터를 저장하는 가장 좋은 방법은 현재 날짜 시간 (밀리 초)을 저장하는 것입니다. 다음은 so_을 할 수있는 코드입니다
SQLite는 DB에 데이터를 저장하는 가장 좋은 방법은 현재 날짜 시간 (밀리 초)을 저장하는 것입니다. 다음은 so_을 할 수있는 코드입니다
public static long getTimeMillis(String dateString, String dateFormat) throws ParseException { /*Use date format as according to your need! Ex. - yyyy/MM/dd HH:mm:ss */ String myDate = dateString;//"2017/12/20 18:10:45"; SimpleDateFormat sdf = new SimpleDateFormat(dateFormat/*"yyyy/MM/dd HH:mm:ss"*/); Date date = sdf.parse(myDate); long millis = date.getTime(); return millis; }
public void insert(Context mContext, long dateTimeMillis, String msg) { //Your DB Helper MyDatabaseHelper dbHelper = new MyDatabaseHelper(mContext); database = dbHelper.getWritableDatabase(); ContentValues contentValue = new ContentValues(); contentValue.put(MyDatabaseHelper.DATE_MILLIS, dateTimeMillis); contentValue.put(MyDatabaseHelper.MESSAGE, msg); //insert data in DB database.insert("your_table_name", null, contentValue); //Close the DB connection. dbHelper.close(); }
지금, 당신의 데이터 (날짜 전에 currentTimeMillis 초입니다) DB에 삽입 얻을됩니다.
다음 단계는 DB에서 데이터를 검색 할 때 날짜를 대응하는에 각각의 날짜 시간 (밀리 초)을 변환 할 필요가있다. 아래는 same_을 할 수있는 간단한 코드가있다
public static String getDate(long milliSeconds, String dateFormat) { // Create a DateFormatter object for displaying date in specified format. SimpleDateFormat formatter = new SimpleDateFormat(dateFormat/*"yyyy/MM/dd HH:mm:ss"*/); // Create a calendar object that will convert the date and time value in milliseconds to date. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(milliSeconds); return formatter.format(calendar.getTime()); }
public ArrayList<String> fetchData() { ArrayList<String> listOfAllDates = new ArrayList<String>(); String cDate = null; MyDatabaseHelper dbHelper = new MyDatabaseHelper("your_app_context"); database = dbHelper.getWritableDatabase(); String[] columns = new String[] {MyDatabaseHelper.DATE_MILLIS, MyDatabaseHelper.MESSAGE}; Cursor cursor = database.query("your_table_name", columns, null, null, null, null, null); if (cursor != null) { if (cursor.moveToFirst()){ do{ //iterate the cursor to get data. cDate = getDate(cursor.getLong(cursor.getColumnIndex(MyDatabaseHelper.DATE_MILLIS)), "yyyy/MM/dd HH:mm:ss"); listOfAllDates.add(cDate); }while(cursor.moveToNext()); } cursor.close(); //Close the DB connection. dbHelper.close(); return listOfAllDates; }
이 모두 도움이 될 것입니다 희망! :)
-
==============================
7.-Exactly StErMi 같은 일 밝혔다.
-Exactly StErMi 같은 일 밝혔다.
이 -이 읽어 보시기 바랍니다 : http://www.vogella.de/articles/AndroidSQLite/article.html
3 -
Cursor cursor = db.query(TABLE_NAME, new String[] {"_id", "title", "title_raw", "timestamp"}, "//** YOUR REQUEST**//", null, null, "timestamp", null);
여길 봐:
의 SQLiteDatabase의 쿼리 ()
4 - 참조 답변 3
-
==============================
8.나는이 선호합니다. 이것은 가장 좋은 방법,하지만 빠른 해결책이 아니다.
나는이 선호합니다. 이것은 가장 좋은 방법,하지만 빠른 해결책이 아니다.
//Building the table includes: StringBuilder query= new StringBuilder(); query.append("CREATE TABLE "+TABLE_NAME+ " ("); query.append(COLUMN_ID+"int primary key autoincrement,"); query.append(COLUMN_CREATION_DATE+" DATE)"); //Inserting the data includes this: SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); values.put(COLUMN_CREATION_DATE,dateFormat.format(reactionGame.getCreationDate())); // Fetching the data includes this: try { java.util.Date creationDate = dateFormat.parse(cursor.getString(0); YourObject.setCreationDate(creationDate)); } catch (Exception e) { YourObject.setCreationDate(null); }
-
==============================
9.
"SELECT "+_ID+" , "+_DESCRIPTION +","+_CREATED_DATE +","+_DATE_TIME+" FROM "+TBL_NOTIFICATION+" ORDER BY "+"strftime(%s,"+_DATE_TIME+") DESC";
from https://stackoverflow.com/questions/7363112/best-way-to-work-with-dates-in-android-sqlite by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 하나 개의 컬럼에 DISTINCT SELECT (0) | 2020.03.22 |
---|---|
[SQL] 어떻게 플라스크-SQLAlchemy의 응용 프로그램에서 원시 SQL을 실행합니다 (0) | 2020.03.22 |
[SQL] T-SQL : 모든 중복 행을 삭제하지만 하나를 유지 [중복] (0) | 2020.03.22 |
[SQL] 설문 조사에 대한 데이터베이스 설계 [폐쇄] (0) | 2020.03.22 |
[SQL] HAVING 및 WHERE 사이의 차이점은 무엇입니까? (0) | 2020.03.22 |