SQL

SQL DATEDIFF( ) / TIMESTAMPDIFF( ) / case when then else end

GABOJOK 2023. 9. 24. 14:40

DATEDIFF(  )

๐Ÿ‘‰  ์ฐจ์ด ๊ตฌํ•˜๋Š” ์• 

๐Ÿ‘‰  datediff( '์‹œ์ž‘' , '๋')

๐Ÿ‘‰  "์‹œ์ž‘" ์—์„œ "๋" ์„  ๋บ€

select * from enrolleds_detail ed 
 where week = 1 
   and seen = true 
   and done = true 
   and datediff(done_date , seen_date) > 0

 

 

 

TIMESTAMPDIFF(  )

๐Ÿ‘‰  ์ฐจ์ด ๊ตฌํ•˜๋Š” ์• . ์ฐจ์ด๋ฅผ ๊ตฌํ•  ๋‹จ์œ„ ์ง€์ • ๊ฐ€๋Šฅ

๐Ÿ‘‰  timestampdiff(๋‹จ์œ„,  '์‹œ์ž‘', '๋')

๐Ÿ‘‰  "๋" ์—์„œ "์‹œ์ž‘" ์„  ๋บ€ 

select timestampdiff(second, seen_date, done_date) 
 From enrolleds_detail ed 
where done = true 
  and seen = true 
  and timestampdiff(second, seen_date, done_date) > 0

 

 

๐Ÿ‘‰  ๊ตฌ๋ถ„์ž๋Š” year, month, week, day, hour, minute, second ๋“ฑ ์ด ์žˆ๋‹ค.

 

 

 

DATEDIFF(  ) / TIMESTAMPDIFF(  )  ์˜ˆ์‹œ

 

 

 

CURDATE(  )

๐Ÿ‘‰  ์ง€๊ธˆ ์‹œ๊ฐ„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์• .

๐Ÿ‘‰  current date์˜ ์•ฝ์ž

 

 

select enrolled_detail_id, 
       ADDDATE(CURDATE(), 1), 
       done_date, 
       DATEDIFF(ADDDATE(CURDATE(), 100), done_date)
  from enrolleds_detail ed 
 where done = true 
   and seen = true

 

 

ADDDATE(  ๋Œ€์ƒ,  ๋”ํ•  ๋‚ ์งœ )

๐Ÿ‘‰  ๋‚ ์งœ์— ์›ํ•˜๋Š” ๋งŒํผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

SUBSTRING_INDEX( )    

๐Ÿ‘‰  ๋ฌธ์ž์—ด ์กฐ๊ฐ๋‚ด๊ธฐ

๐Ÿ‘‰  SUBSTRING_INDEX(ํ•„๋“œ ์ด๋ฆ„, '๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐค๊ฑด์ง€',  ๋ช‡๋ฒˆ์งธ ์กฐ๊ฐ ๊ฐ€์ ธ์˜ฌ๊ฑด์ง€)

๐Ÿ‘‰  ๋์— ์ˆซ์ž๊ฐ€ -1 ์ด๋ผ๋ฉด, ๋งˆ์ง€๋ง‰๊บผ ๋ณด์—ฌ๋‹ฌ๋ผ๋Š” ๋ง.

 

select name, 
       email, 
       SUBSTRING_INDEX(email, '@',1) 
  from users

 

 

 

 

SUBSTRING( )    

๐Ÿ‘‰  ๋ฌธ์ž์—ด ์ž๋ฅด๊ธฐ

๐Ÿ‘‰  SUBSTRING (ํ•„๋“œ ์ด๋ฆ„, '์‹œ์ž‘์œ„์น˜',  '๋ช‡๊ฐœ ์ž๋ฅผ๊ฑด์ง€')

๐Ÿ‘‰  ์‹œ์ž‘์œ„์น˜๊ฐ€ 1์ด๋ผ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž๋ฅธ๋‹ค๋Š” ์˜๋ฏธ. (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ž‘ ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง๊ธฐ.)

select order_no,
       created_at , 
       substring(created_at, 1,10)  
  From orders o

 

 

 

 

 

case  ~ then  ~  esle  ~ end 

๐Ÿ‘‰  ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ, ์ €๋Ÿฐ ๊ฒฝ์šฐ ์ €๋ ‡๊ฒŒ 

๐Ÿ‘‰  ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅ

๐Ÿ‘‰  case when  ์กฐ๊ฑด  then  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ    esle  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ  end as ํ•„๋“œ์ด๋ฆ„๋ถ™์—ฌ์ฃผ๊ธฐ

 

select pu.user_id, pu.point,
  case when pu.point > 10000 then '์ž˜ ํ•˜๊ณ  ์žˆ์–ด์š”!'
  else '์กฐ๊ธˆ๋งŒ ๋” ํŒŒ์ดํŒ…!'end as msg
  from point_users pu

 

 

 

 

case๋ฌธ, with๋ฌธ, subquery ๋ณตํ•ฉ ์˜ˆ์‹œ

with table1 as
	(
      select a.lv, count(* ) from 
		(
      	 select pu.user_id, pu.point,
           case when pu.point > 10000 then '1๋งŒ ์ด์ƒ'
                when pu.point > 5000 then '5์ฒœ ์ด์ƒ'
           else '5์ฒœ ๋ฏธ๋งŒ' end as lv
           from point_users pu
        )a
      group by a.lv
	)
    
select a.lv, count(*) from table1 a
group by a.lv

 

 

์ผ๋‹จ ๋‚ด๋ถ€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋จผ์ € ๋ด์•ผํ•œ๋‹ค.

 select pu.user_id, pu.point,
   case when pu.point > 10000 then '1๋งŒ ์ด์ƒ'
        when pu.point > 5000 then '5์ฒœ ์ด์ƒ'
   else '5์ฒœ ๋ฏธ๋งŒ' end as lv
   from point_users pu

point_users ๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ user_id, point ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ,

๋งŒ์•ฝ ์ด๋Ÿฐ๊ฒฝ์šฐ๋ผ๋ฉด

point > 10000 

๊ทธ๋ ‡๋‹ค๋ฉด '1๋งŒ ์ด์ƒ' ์ด๋ผ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ ,

 

๋งŒ์•ฝ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ผ๋ฉด 

point > 5000 

๊ทธ๋ ‡๋‹ค๋ฉด '5์ฒœ ์ด์ƒ' ์ด๋ผ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ ,

 

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด

 '5์ฒœ ๋ฏธ๋งŒ' ์ด๋ผ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ค˜.

 

end ๋

 ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐ์ดํ„ฐ๋“ค์˜ ์ด๋ฆ„์€ lv๋กœ ํ• ๊ป˜.

 

 

 

 

๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๊ธˆ ๋งŒ๋“  ์ด ์ฟผ๋ฆฌ๋ฌธ์„ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ์˜ from ์ ˆ์— ๋„ฃ์–ด์„œ ์ด๋ฏธ ์žˆ๋Š” ํ…Œ์ด๋ธ” ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋ณด๊ธฐ ํž˜๋“œ๋‹ˆ๊นŒ with table1 as () ๋ฅผ ์ด์šฉํ•ด ์ •๋ฆฌ.