2017-05-10 5 views
1

레일스를 사용하고 있습니다. 내가 hstore를 사용하여 해시로 포스트 그레스 DB에 매월 카운트를 저장했습니다.특정 날짜 형식의 키로 해시 값 검색

다음 저장된 해시 포맷 :

{ "2017년 3월 1일 세계 협정시 00시 00분 0초"= ""10 ","세계 협정시 00시 00분 0초 2017년 4월 1일 "= > "3"}

키에 사용 된 날짜 형식으로 인해이 해시에서 특정 월수를 검색하는 좋은 방법을 찾기 위해 고심하고 있습니다. 질문

현재의 해시 키 날짜 형식과 일치하는 문자열을 포맷하는 가장 좋은 방법은 무엇입니까

?

  • 는 해시 3월에 대한 예를 들어 키가 "2017년 3월 1일 세계 협정시 00시 00분 0초"그러나

  • 이며, 새로운 날짜 시간 3 월 1 일 2017 2017- "로 포맷 03-01T00 : 00 : 00 + 00 : 00 "

또는 먼저 해시를 저장하는 방식을 변경하는 것이 가장 좋습니다.

답변

0

특정 형식의 타임 스탬프가 필요한 경우 사용할 표준 도구는 DateTime#strftime입니다 (모든 time-ish 클래스는 strftime 메서드를 가지며 모두 동일하게 동작 함). 귀하의 경우 :

some_datetime.utc.strftime('%Y-%m-%d %H:%M:%S %Z') 

그리고 최대 액티브에 있음을 접선 :

Model.where('your_hstore -> :key', :key => some_datetime.utc.strftime('%Y-%m-%d %H:%M:%S %Z')) 

또는 :

Model.where('your_hstore -> ?', some_datetime.utc.strftime('%Y-%m-%d %H:%M:%S %Z')) 

%Z는 "시간대의 약어 이름"이어야하며 나를 위해 'UTC', 'PDT'과 같은 문자열을 생성합니다 ... strftime (거의 확실 strftime의 시스템의 libc의 버전 주위에 단지 래퍼입니다) 당신은 몇 가지 옵션이 다음 원하는 문자열을 생성하지 않습니다 :

  1. 드롭 완전히 시간대 항상 UTC 될 것인지를. 그런 다음 키는 2017-03-01 00:00:00처럼 표시되며 '%Y-%m-%d %H:%M:%S'strftime 형식 문자열로 사용합니다.
  2. 키가 실제로 나타나는 날짜는 실제로 날짜이며 드롭 다운 시간입니다. 그런 다음 키가 2017-03-01처럼 보이면 DateTime이 아닌 Ruby에서 Date 인스턴스를 사용하고, 루비에서는 some_date.strftime('%Y-%m-%d') 또는 some_date.iso8601을 사용하여 hstore 키를 얻을 수 있습니다.
  3. UTC가 아닌 시간대를 사용하는 경우 모든 것을 UTC로 변환하고 또는 으로 이동하십시오.
  4. 위의 항목을 원하지 않으면 숫자 시간대 오프셋 (2017-05-10 18:05:57 +0000, 2017-05-10 18:06:48 +00 : 00, ..)으로 전환하십시오. .) strftime 형식 문자열에 %z, %:z 또는 %::z을 사용하십시오 (이 세 가지의 차이점은 문서 참조).

물론 데이터베이스에 이미있는 모든 데이터를 다시 작성해야하지만 나중에 더 빨리 처리하는 것이 가장 좋습니다.

+0

감사합니다. 그러나 나는 여전히 올바른 strftime 포맷 조합을 찾기 위해 고심하고있다. .utc.strftime ('% Y- % m- % d % H : % M : % S % Z'결과는 = 2017-03-01 00:00:00 +00 : 00 – TCEchicago

+0

'% Z 'UTC, PDT와 같은 멋진 것들을 제공하지만 ... 옵션이 있습니다. 업데이트 된 답변을 살펴보십시오. 기록을 보면, 시간대가 나쁘다 .. –

+0

strftime의 % Z가 왜 그랬는지 알 수 없었습니다. 시간대에 대한 UTC 결과입니다. 내가 훨씬 더 나은 솔루션을 전반적인 데이터베이스에 저장된 해시 밖으로 스트리핑 끝났다. 도움 주셔서 감사합니다 !! – TCEchicago