// 선 reference : https://docs.djangoproject.com/en/dev/topics/serialization/


장고에서 기본 json serializer를 이용하면 내가 원치 않는 형식으로 나오게 된다.


pk가 노출되거나, model명이 나오거나, fields 밑에 필드가 나오거나...


물론 이걸 장고 내에서 그대로 deserialize 하는 경우에는 별 문제 없이 작동하겠지만, 다른 플랫폼과 통신하는 용도로 쓰기에는 조금 무리가 있다.


이전 프로젝트에서는 클라이언트에서 거의 무조건적으로 서버의 형식에 맞춰줬는데, 조금 비효율이었다.


그 당시 조사를 할 때는 해결 방안이 잘 보이지 않았는데 나중에 시간이 지나 비슷한 문제로 다시 검색을 하니 해결책이 보였다.





또는 더 응용하면 다른 원하는 형식으로 출력할 수 있겠더라.


장고 상에서 deserialize는

이런 식으로 하는데 앞의 serializers를 override하여 입맛에 맞게 바꿔주면 된다.


그냥 json serializer로 가면 어디를 손대야 할지 잘 보이지 않는다.


여기보다는 json serializer가 상속한 python serializer의 get_dump_object를 조금 수정하면 된다.



여기에서 models와 fields 필드를 붙이는 걸로 보인다.


그러니 serializer를 상속하고 get_dump_object를 override 해서 원하는 형식으로 object를 dump하도록 하면 된다.



// 출처 : http://stackoverflow.com/questions/15453072/django-serializers-to-json-custom-json-output-format

'Projects > django' 카테고리의 다른 글

django에서 BigIntegerField로 pk나 fk 쓰기  (0) 2015.02.12
Posted by 병아리

Dalvik/1.6.0 (Linux; U; Android 4.4.4; SHV-E210S Build/KTU84P)

Posted by 병아리

1. 원래 카카오 sdk는 쓰기 어렵거나

2. 쓰기는 쉬운데, 설명을 이해하기 참~ 쉽게 잘 해놨거나

3. 설명이 진정 쉬운데 내가 멍청해서(국어든 코딩이든) 이해를 못하거나


이 셋 중에 무엇이 참인 명제인지 엄청 고민을 하다가 검색을 하고 문제를 해결하게 되었다.


// 선 레퍼런스 : https://developers.kakao.com/docs/android


이 글을 찾아온 사람이라면 위 문서로는 구현은커녕 임포트조차 어떻게 하는지 잘 모르겠는 경우일 것이다. 나 또한 그랬으니까...


이전 이클립스에서는 어떻게 했는지 모르겠지만 (이 경우는 이미 인터넷에 많은 자료가 있다), 스튜디오로 바뀌면서 약간씩 바뀐 것 같다.


그래서 나 같이 스튜디오로 안드 개발을 시작한 사람은 환경이 달라 어떻게 적용해야 할지 잘 모를 수도 있다.


그런 사람들과 미래의 다른 프로젝트를 시작하는 나를 위해 적어놓는다.




우선, 카카오의 개발 커뮤니티에 벌써 나와 비슷한 어려움을 겪고 그 해결책을 공유해주신 고마운 분들이 계시다.


이 글 또한 그 분들의 노고를 참고하고 적용하여 내 나름대로 다시 정리한 것이다.


원 글 출처는 하단에 첨부해두었다. 레퍼런스보다는 설명이 잘 되어 있어서 출처로 바로 가서 그걸 보고 적용하여도 큰 문제는 없을 것이다.



1. 모듈이 아닌 프로젝트의 /build.gradle을 열어 allprojects에 다음을 추가한다.
mavenCentral()
maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }

2. 다른 gradle에서 가져다 쓰기 위해 다음을 /gradle.properties 에 정의한다.

원문의 경우 버전이 1.0.40이었지만 현재 최신 버전은 50이다. 각자 현재의 최신 버전을 적어주도록 하자.

KAKAO_SDK_GROUP=com.kakao.sdk

KAKAO_SDK_VERSION=1.0.50


3. 모듈(app)의 /app/build.gradle 의 dependencies에 다음을 추가한다.

compile group: project.KAKAO_SDK_GROUP, name: '__모듈명__', version: project.KAKAO_SDK_VERSION

원문은 카카오링크 사용을 위해 kakaolink로 예시를 보여줬는데, 나는 사용자 로그인을 구현하기 위함이니 usermgmt로 추가하였다. 각자 필요로 하는 모듈명으로 추가해주면 될 것이다.

나머지 모듈명은 sdk의 sample 안의 각 모듈의 build.gradle을 보면 나와있다. (폴더명과 동일)


4. /app/AndroidManifest.xml에서 카카오 앱 키를 추가한다.

카카오 api 키를 받는 방법은 레퍼런스에도 나와있고 그다지 어렵지 않다.

4개가 있는데 가장 위의 네이티브 앱 키를 복사해서 붙여넣는다.

<meta-data android:name="com.kakao.sdk.AppKey"

              android:value="__카카오 api key__" />

위치는 application element의 자식에 (즉, activity와 같은 depth) 추가한다.


5. /app/build.gradle에 packagingOptions 를 추가한다.

packagingOptions {

    exclude 'META-INF/LICENSE'

    exclude 'META-INF/NOTICE'

}

4번까지 하면 다 된 것 같은데 실제 디버그를 돌려보면 패키징 중에 무슨 jackson-*.jar 가 duplicate되었다고 오류를 내뱉으며 안될 것이다.

이럴 경우 위의 구문을 /app/build.gradle에서 android element의 자식에 (즉, defaultConfig와 buildTypes와 같은 depth) 추가한다.



import는 여기까지면 충분하다. 이제 good to go!

여기서부터 밑의 내용은 나 혼자서 이해한 내용을 적은거라 틀릴 수도 있으니 적당히 잘 걸러 듣기를 바란다.




6. 실제 activity에 구현

카카오 링크를 쓰는 방법은 원 글에 잘 나와있고, 나는 카카오 계정을 이용한 로그인 기능을 쓸 것이다.

나도 아직은 로그인까지밖에 학습하지 않았기에 로그인만 적도록 하겠다. 이 정도까지 왔으면 아마 카카오의 레퍼런스가 이해되고 어떻게 사용하는건지 눈에 들어오기 시작할 것이다.


초기에 sdk를 이해하는데 있어서 나를 더 어렵게 만들었던 것이 sample과 template 이었다. 카카오 문서를 위에서 문서 잘 읽다보면 이런 문구를 만나게 되는데...

3. 로그인 Activity의 예제 코드로 loginbase-template에 포함된 com.kakao.template.loginbase.SampleLoginActivity입니다.

로그인기반으로 한 샘플 usermgmt-sample, kakaostory-sample, kakaotalk-sample, push-sample의 로그인 Activity는 이를 상속하여 구현하고 있습니다.

이해한 뒤에 다시 보면 괜찮은데 처음 봤었을 때에는 loginbase는 뭐고 template은 뭐지? *-sample과는 어떤 관계지? 또, SampleLoginActiviy는 뭐야? 뭐가 진짜 샘플이고 무엇을 보고 익혀야 하는거지? 난 그냥 로그인만 하고 싶은거면 뭘 봐야 하는거지????


가뜩이나 문서도 이해하기 어렵고 샘플을 봐도 구조조차 이해가 되지 않아 다시 문서를 차근히 보는데 이 문구를 보고 미치는 줄 알았다...


그러다가 샘플에 내 앱 키를 넣고 실행시켜 이것저것 써보면서 코드를 조금씩 이해했다.


잡설이 길었고 정리...



우선, 나와 같은 로그인 기능을 쓰는 사람은 SampleLoginActivity와 SampleSignupActivity를 이해하고 그 예시를 중점적으로 보면 될 것이다.

샘플로긴액티비티는 실제 카톡 로긴 창을 띄우고, 사인업은 사용자가 우리 앱에 가입할 것인지를 물어오는 창 인 것 같다.


따라서, *-sample 앱들과 같이 위의 액티비티를 상속해서 써도 되고(그대로 호출하거나 override), 아니면 실제 저 두 액티비티 속에 구현된 메소드를 긁어와서 내 액티비티에서 그대로 사용해도 된다. 뭐가 더 나은지 dry에 대한 것은 각자 개인의 판단에 맡기도록 하겠다.


방금 두 문단이 이해가 된다면, 저 위의 카카오 문서 인용문도 이해가 될 것이다.

SampleLoginActivity에서 카카오의 로그인 api를 진짜로 사용하는 로직을 구현해놓고, 각 *-sample에서 입맛에 맞게 override해서 사용하는걸 볼 수 있다.

그러니 템플릿이라고 이름을 붙여놓은 거겠지...? 갖다 쓰라고...?


이걸 미리 알았으면 더 쉽게 이해했을텐데... 내가 멍청한 셈 치자...



그리고 잊지 말아야 할 점이 한가지 더 있는데, 다른 모듈은 모르겠지만 usermgmt를 통한 카카오 계정 로그인을 쓸 예정이라면 무조건!

는 가장 처음에 실행시켜줘야 한다.

이 연유로 템플릿의 클래스를 바로 갖다쓰면 안된다고 나올 것이다. 왜냐하면 GlobalApplication 이라는 곳에서 Session.initialize(this); 해주고 있으니까... 다른 곳에 숨어있었을 줄이야... 물론 문서에도 나오기는 하니까 할 말은 없다. 대충 읽은 내 잘못이지.

주로 카톡로긴을 쓰는 activity의 onCreate의 시작부분에 넣으면 큰 문제가 없을 것이다.


즉, 내 액티비티에서 세션 초기화를 해주고, SampleLogin의 로직을 복붙해서 쓰거나,

아니면, SampleLogin을 상속하는 액티비티를 써도 될 것이다. (후자는 위에서 초기화 필요)


결론 : 실제 가져다 쓸 모듈은 Sample*Activity... *-sample 앱들은 앞의 템플릿(Sample*Activity)을 어떻게 갖다 쓰는지 예시를 보여주는 것이다.



// 출처 : [환경] 안드로이드 스튜디오(Android Studio)에서 Gradle로 카카오톡 SDK 사용

// 참고 : [가이드] AndroidStudio를 이용한 카카오SDK import 시키기

'Projects > android' 카테고리의 다른 글

안드로이드 httpurlconnection의 user-agent  (0) 2015.05.11
Posted by 병아리

블로그를 해킹당한 이후로는 관리하기 귀찮아서 쳐다보지도 않았는데, 오늘 코딩하다가 무언가 기록해야할 필요성이 있다고 생각되는 것을 알게 되었는데 이것을 기록할 곳이 없어서 잠시 고민하다가 결국 여기로 다시 돌아왔다.


자주 적지는 못하(않?)겠지만 그래도 오늘처럼 알아내는데 시간이 제법 걸리거나, 다음에 또 쓸 가능성이 있는 것들은 같은 사항으로 고민하는 다른 코더들을 위해, 그리고 바보같이 또 인터넷을 헤매며 삽질하고 있을 미래의 나를 위해 적어두어야겠다.



아, 참고로 이 방법은 1.7.3의 장고와 파이선 3.x 에서 이용가능하다.

issue가 올라와 있으니까 언젠가는 built-in으로 사용가능하겠지만, 그 전까지는 현재 버전의 상황에 맞게 살짝 바꿔서 사용해야 할 것이다.



그럼 배경설명부터...


django에서 모델을 정의할 때, 일반적으로는 pk를 서술하지 않는다.

왜냐하면 아무 필드에 primary_key=True를 먹이지 않는한, 장고에서 알아서 만들어서 추가해준다.

https://docs.djangoproject.com/en/1.7/topics/db/models/#automatic-primary-key-fields

https://docs.djangoproject.com/en/1.7/ref/models/fields/#autofield


일반적인 작은 웹 프로젝트의 경우에는 별 문제없이 사용할 수 있지만, 상황에 따라 pk가 일정 범위를 넘는 경우가 생길 수 있는데, 이때는 int만으로는 버거울 수도 있다.



그래서 아무 생각없이 BigIntegerField를 id로 정의하고 primary_key를 주고나서 새로생긴 migrate 기능을 이용해서 alter를 시도하니 안되더라... (내가 잘못한걸 수도 있음...)


인터넷을 찾아보니 구글에서도 비슷한 질문을 올린 사람들이 꽤나 있었다.

위에 issue도 올라온지 4년이 넘었는데 아직까지 기능추가가 되지 않았더라.

하긴, 1씩 커져서 저 큰 숫자를 넘긴다는게 정말 쉽지는 않겠지...


첫번째 댓글에 있는

이것도 시도해봤는데, 단순히 id로만 쓰는 경우에는 이걸로 해결될 수도 있겠지만, 나의 경우와 같이 다른 테이블에 foreign key로 묶여서 연결되어 있는 경우라면 아마 안될거다...


그래서 stackoverflow에서도 이것저것 찾아서 시도해보다가 이런걸 발견했다.

https://gist.github.com/thomasyip/3158388

설마 될까? 싶어서 가져와서 indentation만 조금 고쳐서 써봤는데 db 엔진을 매칭하는 부분이 현재 버전과 조금 달라 안되더라.

파이썬이나 장고를 잘 아는 사람은 여기까지만 읽어도 쉽게 해결하겠지만, 아닌 사람들(+미래의 나)을 위해 내가 실제 쓴 stub을 밑에 적어두도록 하겠다.

그리고 이전 버전에서 쓰였던 long()이 있기때문에 이것도 int()로 바꿔주었다

저작권은 github 링크의 저자에게 있는거겠지...?

그러니 이거 안된다, 저거 안된다 저에게는 묻지 말아주세요... 저도 아직 장고 초보랍니다 ㅜ_ㅜ

아, db는 mysql을 쓰고 있는 중이다. 당연히, 다른 db엔진에서는 전혀 테스트 된 바 없음...


// 추가

다른 db엔진에서 테스트 해볼 기회는 없었지만, sqlite3의 경우에는 "BIGINT"로 해야하는 것 같다...




이거 넣으려고 syntaxhighlighter까지 깔았다... 진작 써볼껄... 이거 좋네.



'Projects > django' 카테고리의 다른 글

custom json serializer in django  (0) 2015.05.14
Posted by 병아리

디데이 카운터

Projects 2012. 8. 16. 06:12


dday_counter_csv.py


dday.csv


디데이 카운터

Posted by 병아리

써보자

Projects/일반론 2011. 10. 16. 00:42
Mindjet
CodeBeamer 

'Projects > 일반론' 카테고리의 다른 글

ip와 dns를 바꿔주는 bat  (0) 2011.04.14
MySQL - 날짜 함수  (0) 2011.01.11
내가 짠 서브쿼리 2 Subquery in MySQL  (0) 2010.12.17
Posted by 병아리
매번 찾아서 다시 적기 짜증....


'Projects > 일반론' 카테고리의 다른 글

써보자  (0) 2011.10.16
MySQL - 날짜 함수  (0) 2011.01.11
내가 짠 서브쿼리 2 Subquery in MySQL  (0) 2010.12.17
Posted by 병아리
// 출처 : http://jeongsam.net/112

MySQL 함수

날짜 함수

NOW(), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, LOCALTIMESTAMP()

현재 시간을 리턴합니다.

SYSDATE()

'YYYY-MM-DD HH:MM:SS' 또는 'YYYYMMDDHHMMSS' 형식으로 현재 날짜나 시간을 리턴합니다. 5.0.13 버전이후부터는 SYSDATE()는 실행 시점의 시간을 표시하므로 NOW()와 차이점이 있습니다. 아래 명령을 실행하여 차이점을 확인하세요.

SELECT NOW(), SLEEP(2), NOW();
SELECT SYSDATE(), SLEEP(2), SYSDATE();

CURDATE(), CURRENT_DATE, CURRENT_DATE()

'YYYY-MM-DD' 또는 'YYYYMMDD' 형식으로 현재 날짜를 리턴합니다.

CURTIME(), CURRENT_TIME, CURRENT_TIME()

'HH:MM:SS' 또는 'HHMMSS.uuuuuu' 형식으로 현재 시간을 리턴합니다.

DATE_FORMAT(date,format)

date로 지정된 날짜른 format에 의해 표시합니다.

기호설명
%a Sun, ..., Sat와 같은 요일의 약어 표시
%b Jan, ..., Dec와 같은 달이름 약어 표시
%c 1 ~ 12 사이의 월 표시
%D 1st, 2nd, ... 와 같은 형식의 달의 날짜 표시
%d 00, ..., 31 형식의 달의 날짜 표시
%e 0, ..., 31 형식의 달의 날짜 표시
%f 마이크로초 표시
%H 24시간 형식의 시간 표시(00, ..., 23)
%h, %I 12시간 형식의 시간 표시(01, ..., 12 )
%i 분 표시(00, ..., 59)
%j 년의 날짜 표시(001, ..., 366)
%k 24시간 표시(0, ..., 23)
%l 12시간 표시(1, ..., 12)
%M 달 이름 표시(Jenuary, ..., December)
%m 달 순서 표시(00, ..., 12)
%p AM, PM 표시
%r 12시간제 표시(HH:MM:SS AM or PM)
%S, %s 초 표시(00, ..., 59)
%T 24시간제 표시(HH:MM:SS)
%U 일요일을 시작으로 년의 몇번째 주인가를 00, ..., 53으로 표시한다.
%u 월요일을 시작으로 년의 몇번째 주인가를 00, ..., 53으로 표시한다.
%V %X와 함께 쓰여 일요일을 시작으로 년의 몇번째 주인가를 01, ..., 53으로 표시한다.
%v %x와 함께 쓰여 월요일을 시작으로 년의 몇번째 주인가를 01, ..., 53으로 표시한다.
%W 요일명 표시(Sunday, ..., Saturday)
%w 요일의 순서를 표시(0=Sunday, ..., 6=Saturday)
%X %V와 함께 쓰이며 일요일을 시작하는 주를 기준으로 YYYY 형태의 년도를 표시한다.
%x %v와 함께 쓰이며 월요일을 시작하는 주를 기준으로 YYYY 형태의 년도를 표시한다.
%Y YYYY 형식으로 년도를 표시한다.
%y YY 형식으로 년도를 표시한다.
%% % 문자를 표시한다.

 

GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})

특정 국가의 형식으로 표시합니다. 메뉴얼을 참고 하세요.

YEAR(date)

'1000'에서 '9999' 사이의 년도를 리턴합니다.

QUARTER(date)

분기를 1 ~4 로 리턴합니다.

MONTH(date)

월을 1 ~ 12 로 리턴합니다.

MONTHNAME(date)

월 이름을 리턴합니다.

WEEK(date[,mode])

요일 순서를 출력합니다. mode가 지정되면 특정 조건에 맞는 값을 리턴합니다.

ModeFirst day of weekRangeWeek 1 is the first week ...
0 Sunday 0-53 with a Sunday in this year
1 Monday 0-53 with more than 3 days this year
2 Sunday 1-53 with a Sunday in this year
3 Monday 1-53 with more than 3 days this year
4 Sunday 0-53 with more than 3 days this year
5 Monday 0-53 with a Monday in this year
6 Sunday 1-53 with more than 3 days this year
7 Monday 1-53 with a Monday in this year

WEEKDAY(date)

요일 순서를 리턴합니다. (0=Sunday, 1=Monday, ..., 6=Saturday)

WEEKOFYEAR(date)

년중 주의 순서를 리턴합니다. WEEK(date, 3)과 동일한 표현입니다.

YEARWEEK(date), YEARWEEK(date,mode)

해당되는 년도 및 주를 리턴합니다. mode는 WEEK() 함수와 동일한 동작을 합니다.

DAYNAME(date)

요일 이름을 리턴합니다.

DAYOFYEAR(date)

년중 날짜를 리턴합니다.

DAY(date), DAYOFMONTH(date)

월중 날짜를 리턴합니다.

DAYOFWEEK(date)

주중 순서를 리턴합니다. (1=Sunday, 2=Monday, ..., 7=Saturday)

LAST_DAY(date)

해당 월의 마지막 날짜를 리턴합니다.

DATE(expr)

date나 datetime 형식에서 date 부분만 리턴합니다.

HOUR(time)

시간을 리턴합니다.

MINUTE(time)

분을 리턴합니다.

SECOND(time)

초를 리턴합니다.

TIME(expr)

time이나 datetime 형식에서 time 부분만 리턴합니다.

MICROSECOND(expr)

마이크로초를 리턴합니다.

PERIOD_ADD(P,N)

P기간에 N달만큼 더한 결과를 YYYYMM 형태로 리턴합니다.

PERIOD_DIFF(P1,P2)

YYMM 이나 YYYYMM 형식의 P1과 P2 사이가 몇 달인지를 리턴합니다.

DATE_ADD(date,INTERVAL expr unit), ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)

date로부터 expr만큼 type 단위로 더한 날짜를 리턴합니다.

unitexpr
MICROSECOND 마이크로초
SECOND
MINUTE
HOUR 시간
DAY 날짜
WEEK 주차
QUOTER 분기
YEAR
SECOND_MICROSECOND '초.마이크로초'
MINUTE_MICROSECOND '분:초.마이크로초'
MINUTE_SECOND '분:초'
HOUR_MICROSECOND '시:분:초.마이크로초'
HOUR_SECOND '시:분:초'
HOUR_MINUTE '시:분'
DAY_MICROSECOND '일 시:분:초.마이크로초'
DAY_SECOND '일 시:분:초'
DAY_MINUTE '일 시:분'
DAY_HOUR '일 시'
YEAR_MONTH '년-월'

DATE_SUB(date,INTERVAL expr unit), SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)

date로부터 expr만큼 unit 단위로 뺀 날짜를 리턴합니다.

DATEDIFF(expr1,expr2)

expr1과 expr2 사이의 일 수를 리턴합니다.

TIMEDIFF(expr1,expr2)

expr1과 expr2 사이의 시간을 time 형식으로 리턴합니다.

ADDTIME(expr1,expr2)

date나 datetime 형식의 expr1에 time 형식의 expr1을 더한 time 형식의 값을 리턴합니다.

SUBTIME(expr1,expr2)

date나 datetime 형식의 expr1에 time 형식의 expr1을 뺀 time 형식의 값을 리턴합니다.

TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

date나 datetime 형식의 시간을 datetime 형식으로 리턴합니다. expr2가 주어지면 해당 시간으로 시간을 지정합니다.

TIMESTAMPADD(unit,interval,datetime_expr)

datetime_expr로부터 interval만큼 unit 단위로 더한 시간를 리턴합니다.

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

datetime_expr1과 datetieme_expr2 사이를 unit 단위로 리턴합니다.

TIME_FORMAT(time,format)

time 형식의 시간을 format 형식으로 리턴합니다. format은 DATE_FORMAT() 함수와 동일합니다.

EXTRACT(unit FROM date)

date로부터 unit 형식으로 값을 리턴합니다.

SELECT EXTRACT(YEAR FROM SYSDATE());
SELECT EXTRACT(MONTH FROM SYSDATE());
SELECT EXTRACT(DAY FROM SYSDATE());

FROM_DAYS(N)

0년부터 계산되 날 수로부터 날짜를 리턴합니다.

TO_DAYS(date)

date를 기준으로 0년부터 계산된 날 수를 리턴합니다. 그레고리력을 따르지 않습니다.

SEC_TO_TIME(seconds)

초를 time 형식으로 리턴합니다.

TIME_TO_SEC(time)

time 형식의 시간을 초로 리턴합니다.

STR_TO_DATE(str,format)

문자열str을 format 형식의 시간으로 리턴합니다. format문자열은 DATE_FORMAT() 과 동일합니다.

MAKEDATE(year,dayofyear)

year와 day-of-year 값으로 date 형식(YYYY-MM-DD)의 날짜를 리턴합니다.

MAKETIME(hour,minute,second)

hour, minute, second 값으로 time 형식(HH:MM:SS)의 시간을 리턴합니다.

CONVERT_TZ(dt,from_tz,to_tz)

시간대 변경 함수.

FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)

유닉스 타입의 시간을 리턴합니다.

UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)

유닉스 시간 ('1970-01-01 00:00:00' 기준)을 리턴합니다. date가 주어지면 date의 유닉스 시간을 리턴합니다.

UTC_DATE, UTC_DATE()

UTC 시간을 리턴합니다.

UTC_TIME, UTC_TIME()

UTC 시간을 리턴합니다.

UTC_TIMESTAMP, UTC_TIMESTAMP()

UTC 시간을 리턴합니다.

'Projects > 일반론' 카테고리의 다른 글

ip와 dns를 바꿔주는 bat  (0) 2011.04.14
내가 짠 서브쿼리 2 Subquery in MySQL  (0) 2010.12.17
내가 짠 서브쿼리 Subquery in MySQL  (0) 2010.12.17
Posted by 병아리
sql을 오랜만에 + 서브쿼리는 처음 써보니 앞에꺼 만드는데 1시간, 뒤에꺼 같이 깔끔하게 한번 쓰게끔 바꾸는데 2시간 걸린 듯. 그래도 오랜만에 해보니 기억이 다시 새록새록 나서 좋네.

나도 sql 잘 짜고 싶다...



내가 하려고 했던거...

SELECT
*
, c.capacity - SUM(r.quantity) AS remain
FROM
enfant_caterer.caterers AS c
INNER JOIN
enfant_caterer.caterer_reservations AS r
ON
r.caterer_id = c.id
WHERE
r.reserved = '2011-01-01'
AND c.fee <= '10'
AND c.type = '1'
GROUP BY
caterer_id
HAVING
remain >= '6'
AND remain <= '500'


Posted by 병아리
나중에 필요할 때 다시 보기

SELECT
*
FROM
enfant_place.places AS p
WHERE
p.capacity >= '1'
AND p.capacity <= '3'
AND p.fee <= '3'
AND NOT EXISTS
(
SELECT *
FROM enfant_place.place_reservations AS r
WHERE
r.place_id = p.id
AND r.reserved = '2011-01-06'
)
Posted by 병아리

사이드바 열기