2013-08-29 1 views
2

레거시 데이터베이스에서 실행중인 Sequel을 사용하여 Ruby 프로그램을 작성하고 있습니다. 다른 날짜 형식을 다루는 데 문제가 있습니다.DB에서 다른 datetime 형식을 다루고 있습니까?

DB에는 열 start_date이있는 테이블이 있습니다. 일부는 2013-09-01T08:28:00+10:00처럼 ISO8601를 사용하는

  • : 속편의 마이그레이션 스크립트에서 나는 SQLite는의 timestamp 유형 인 DateTime로 설정하지만, 기존의 데이터는 다른 시간 형식을 가지고있다.
  • 일부 사용자는 다른 사용자 이름을 사용하고 있습니다 (예 : 2013-09-01 08:28:00.000000+1000).

문제는 테이블에 대해 쿼리를 실행하고 start_date으로 필터링하려고하면 두 날짜 시간 형식 간의 차이로 인해 잘못된 결과가 발생한다는 것입니다.

내가 사용 쿼리는 다음과 같습니다

current = Time.now 
MyModel.where { start_date < current } 

속편은 다음과 같이 SQL로 변환합니다 : 그것은 문자열로 날짜를 비교하는 것처럼 내 로컬 테스트에서

SELECT * FROM `my_model` WHERE `start_date` < '2013-09-01 08:28:00.000000' 

을, 속편 보인다 따라서 2013-09-01 08:28:00.000000+10002013-09-01T01:28:00+10:00보다 작습니다. 공백이 T보다 작기 때문에 이것은 내가 원하는 것이 아닙니다.

나는 같은 iso8601 시간 사용할 수 있습니다

current_iso8601 = Time.now.iso8601 
MyModel.where { start_date < current_iso8601 } 

을하지만 데이터베이스가 두 개의 서로 다른 날짜 형식을 가지고 있기 때문에이 문제가 해결되지 않습니다.

내 질문은 :

  • 합니까 루비/속편 지원은 문자열로하지 날짜/시간을 기준으로 데이터베이스를 조회?
  • 다른 날짜 형식으로 작동합니까?
  • SQLite는 로컬 테스트 용이며 프로덕션 환경은 MySQL입니다. 따라서 솔루션은 일반 Sequel 메서드를 어댑터로 사용해야하며 데이터베이스 관련 메서드가 없어야합니다.

참고 : 프로그램은 Rails 응용 프로그램이 아닙니다.

대단히 감사합니다!

답변

3

SQLite에는 날짜/시간 유형이 없습니다 (http://sqlite.org/datatype3.html 참조). datetime 값을 문자열로 저장합니다.

최상의 솔루션은 프로덕션 환경에서 사용하는 개발/테스트에서 동일한 데이터베이스를 사용하는 것입니다. 그렇게하고 싶지 않으면 모든 SQLite datetime 값을 모두 같은 ISO8601 형식을 사용하도록 변환해야합니다. 그렇게하면 비교 연산자가 올바르게 작동합니다 (MySQL 에서처럼).

관련 문제