Monday, July 22, 2019

Amount to Words Convert via PostgreSQL

asd



CREATE OR REPLACE FUNCTION dateToWords(the_date TIMESTAMP) RETURNS text AS $$
DECLARE
_month INTEGER;
_day  INTEGER;
_year INTEGER;
_hour INTEGER;
_minute INTEGER;
_year_text TEXT;
_hour_text TEXT;
_day_text TEXT;
_minute_text TEXT;
_exact_time TEXT;
_month_text TEXT;
e TEXT;
BEGIN
_month = EXTRACT(MONTH FROM the_date);
_day = EXTRACT(DAY FROM the_date);
_year = EXTRACT(YEAR FROM the_date);
_hour = EXTRACT(HOUR FROM the_date);
_minute = EXTRACT(MINUTE FROM the_date);


WITH Below20(Word, Id) AS
(
VALUES
  ('Zero', 0), ('One', 1),( 'Two', 2 ), ( 'Three', 3),
  ( 'Four', 4 ), ( 'Five', 5 ), ( 'Six', 6 ), ( 'Seven', 7 ),
  ( 'Eight', 8), ( 'Nine', 9), ( 'Ten', 10), ( 'Eleven', 11 ),
  ( 'Twelve', 12 ), ( 'Thirteen', 13 ), ( 'Fourteen', 14),
  ( 'Fifteen', 15 ), ('Sixteen', 16 ), ( 'Seventeen', 17),
  ('Eighteen', 18 ), ( 'Nineteen', 19 )
),
Below100(Word, Id) AS
(
  VALUES
   ('Twenty', 2), ('Thirty', 3),('Forty', 4), ('Fifty', 5),
   ('Sixty', 6), ('Seventy', 7), ('Eighty', 8), ('Ninety', 9)
)SELECT
CASE
  WHEN (_year % 1000) BETWEEN 1 AND 19 THEN
  CONCAT(
      (Select Word FROM Below20 WHERE ID=_year / 1000), ' Thousand ',
      (Select Word FROM Below20 WHERE ID=_year % 1000)
    )
  WHEN (_year % 1000) BETWEEN 20 AND 99 THEN
  CONCAT(
      (Select Word FROM Below20 WHERE ID=_year / 1000), ' Thousand ',
      (Select Word FROM Below20 WHERE ID=(_year % 1000) / 10), ' ',
      (Select Word FROM Below20 WHERE ID=(_year % 1000) / 10)
    )
  WHEN (_year % 1000) BETWEEN 100 AND 999 THEN
    CASE
        WHEN (_year % 1000) % 100 BETWEEN 1 AND 19 THEN
        CONCAT(
            (Select Word FROM Below20 WHERE ID=_year / 1000), ' Thousand ',
            (Select Word FROM Below20 WHERE ID=(_year % 1000) / 100), ' Hundred ',
            (Select Word FROM Below20 WHERE ID=((_year % 1000) % 100))
          )
        WHEN (_year % 1000) % 100 BETWEEN 20 AND 99 THEN
        CONCAT(
            (Select Word FROM Below20 WHERE ID=_year / 1000), ' Thousand ',
            (Select Word FROM Below20 WHERE ID=(_year % 1000) / 100), ' Hundred ',
            (Select Word FROM Below100 WHERE ID=((_year % 1000) % 100) / 10), ' ',
            (Select Word FROM Below20 WHERE ID=((_year % 1000) % 100) % 10)
          )
    END
END INTO _year_text;


WITH Below20(Word, Id) AS
(
 VALUES
   ('', 0), ('One', 1),( 'Two', 2 ), ( 'Three', 3),
   ( 'Four', 4 ), ( 'Five', 5 ), ( 'Six', 6 ), ( 'Seven', 7 ),
   ( 'Eight', 8), ( 'Nine', 9), ( 'Ten', 10), ( 'Eleven', 11 ),
   ( 'Twelve', 12 )
)
Select
    CASE
      WHEN _hour > 12 THEN (Select Word FROM Below20 WHERE ID= _hour - 12)
      ELSE (Select Word FROM Below20 WHERE ID= _hour)
END INTO _hour_text;



WITH Below20(Word, Id) AS
(
VALUES
  ('', 0), ('First', 1),( 'Second', 2 ), ( 'Third', 3),
  ( 'Fourth', 4 ), ( 'Fifth', 5 ), ( 'Sixth', 6 ), ( 'Seventh', 7 ),
  ( 'Eighth', 8), ( 'Ninth', 9), ( 'Tenth', 10), ( 'Eleventh', 11 ),
  ( 'Twelfth', 12 ), ( 'Thirteenth', 13 ), ( 'Fourteenth', 14),
  ( 'Fifteenth', 15 ), ('Sixteenth', 16 ), ( 'Seventeenth', 17),
  ('Eighteenth', 18 ), ( 'Nineteenth', 19 )
),
Below100(Word, Id) AS
(
   VALUES
    ('Twenty', 2), ('Thirty', 3)
)
Select
CASE
  WHEN _day BETWEEN 1 AND 19 THEN (Select Word FROM Below20 WHERE ID=_day)
  ELSE
  CONCAT(
      (Select Word FROM Below100 WHERE ID= _day / 10), ' ',
      (Select Word FROM Below20 WHERE ID= _day % 10)
   )
END INTO _day_text;



WITH Below20(Word, Id) AS
(
VALUES
  ('', 0), ('One', 1),( 'Two', 2 ), ( 'Three', 3),
  ( 'Four', 4 ), ( 'Five', 5 ), ( 'Six', 6 ), ( 'Seven', 7 ),
  ( 'Eight', 8), ( 'Nine', 9), ( 'Ten', 10), ( 'Eleven', 11 ),
  ( 'Twelve', 12 ), ( 'Thirteen', 13 ), ( 'Fourteen', 14),
  ( 'Fifteen', 15 ), ('Sixteen', 16 ), ( 'Seventeen', 17),
  ('Eighteen', 18 ), ( 'Nineteen', 19 )
),
Below100(Word, Id) AS
(
   VALUES
    ('Twenty', 2), ('Thirty', 3),('Forty', 4), ('Fifty', 5),
    ('Sixty', 6)
)
Select
CASE
  WHEN _minute BETWEEN 1 AND 19 THEN (Select Word FROM Below20 WHERE ID=_day)
  ELSE
  CONCAT(
      (Select Word FROM Below100 WHERE ID= _minute / 10), ' ',
      (Select Word FROM Below20 WHERE ID= _minute % 10)
   )
END INTO _minute_text;



SELECT
CASE
WHEN _hour BETWEEN 0 AND 12 THEN 'Morning'
WHEN _hour BETWEEN 13 AND 17 THEN 'Afternoon'
ELSE 'Evening'
END INTO _exact_time;



WITH nameOfTheMonth(monthAsText, Id) AS
(
VALUES
  ('January', 1), ('February', 2),( 'MARCH', 3), ( 'April', 4),
  ( 'May', 5), ( 'June', 6), ( 'July', 7), ( 'August', 8),
  ( 'September', 9), ( 'October', 10), ( 'November', 11), ( 'December', 12)
)
select monthAsText FROM nameOfTheMonth WHERE ID=_month INTO _month_text;


SELECT CONCAT(
      _day_text, ' day of', ' ',
      _month_text,', ',
     _year_text,', ',
     _hour_text,' ',
     _minute_text, ' in the ',
  _exact_time)
    INTO e;


return e;
END; $$
LANGUAGE PLPGSQL;


select dateToWords('May 15, 2018 5:38 PM')


0 comments:

Post a Comment