mysql_yearweek 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/mysql_yearweek.rb +137 -0
  2. metadata +48 -0
@@ -0,0 +1,137 @@
1
+ # encoding=utf-8
2
+ require 'time'
3
+
4
+
5
+ class MySQLYearweek
6
+ MIN_ALLOWED_DATE = Date.new(1584, 1, 1).freeze
7
+ MAX_TESTED_DATE = Date.new(4000, 12, 31).freeze
8
+
9
+ def self.yearweek(date, mode=4)
10
+ raise TypeError unless date.is_a?(Date)
11
+ if (date < MIN_ALLOWED_DATE)
12
+ raise ArgumentError, "Dates before #{MIN_ALLOWED_DATE} are not allowed"
13
+ end
14
+
15
+ case mode
16
+ when 0
17
+ return mode_zero(date)
18
+ when 1
19
+ return mode_one(date)
20
+ when 2
21
+ return mode_two(date)
22
+ when 3
23
+ return mode_three(date)
24
+ when 4
25
+ return mode_four(date)
26
+ when 5
27
+ return mode_five(date)
28
+ when 6
29
+ return mode_six(date)
30
+ when 7
31
+ return mode_seven(date)
32
+ else
33
+ raise ArgumentError, 'Valid modes are from 0 to 7'
34
+ end
35
+ end
36
+
37
+ def self.mode_zero(date)
38
+ if (date.sunday?)
39
+ date += 1
40
+ end
41
+
42
+ if (last_week_of_year_has_sunday(date.cwyear - 1))
43
+ if (last_week_of_year_has_sunday(date.cwyear - 2))
44
+ last_week_of_prev_year = 52
45
+ else
46
+ last_week_of_prev_year = 53
47
+ end
48
+ year = date.cweek > 1 ? date.cwyear : date.cwyear - 1
49
+ week = date.cweek > 1 ? date.cweek - 1 : last_week_of_prev_year
50
+
51
+ yearweek = "%04d%02d" % [year, week]
52
+ else
53
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
54
+ end
55
+
56
+ yearweek
57
+ end
58
+ private_class_method :mode_zero
59
+
60
+
61
+ def self.mode_one(date)
62
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
63
+ end
64
+ private_class_method :mode_one
65
+
66
+ def self.mode_two(date)
67
+ mode_zero(date)
68
+ end
69
+ private_class_method :mode_two
70
+
71
+ def self.mode_three(date)
72
+ mode_one(date)
73
+ end
74
+ private_class_method :mode_three
75
+
76
+ def self.mode_four(date)
77
+ if (date.sunday?)
78
+ date += 1
79
+ end
80
+
81
+ if (Date.new(date.cwyear, 1, 1).thursday?)
82
+ week = date.cweek > 1 ? date.cweek - 1 : 53
83
+ year = week == 53 ? date.cwyear - 1 : date.cwyear
84
+
85
+ yearweek = "%04d%02d" % [year, week]
86
+ else
87
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
88
+ end
89
+
90
+ yearweek
91
+ end
92
+ private_class_method :mode_four
93
+
94
+ def self.mode_five(date)
95
+ if (last_week_of_year_has_monday(date.cwyear - 1))
96
+ if (last_week_of_year_has_monday(date.cwyear - 2))
97
+ last_week_of_prev_year = 52
98
+ else
99
+ last_week_of_prev_year = 53
100
+ end
101
+ year = date.cweek > 1 ? date.cwyear : date.cwyear - 1
102
+ week = date.cweek > 1 ? date.cweek - 1 : last_week_of_prev_year
103
+
104
+ yearweek = "%04d%02d" % [year, week]
105
+ else
106
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
107
+ end
108
+
109
+ yearweek
110
+ end
111
+ private_class_method :mode_five
112
+
113
+ def self.mode_six(date)
114
+ mode_four(date)
115
+ end
116
+ private_class_method :mode_six
117
+
118
+ def self.mode_seven(date)
119
+ mode_five(date)
120
+ end
121
+ private_class_method :mode_five
122
+
123
+ def self.last_week_of_year_has_sunday(year)
124
+ Date.new(year, 12, 28).sunday? or
125
+ Date.new(year, 12, 29).sunday? or
126
+ Date.new(year, 12, 30).sunday? or
127
+ Date.new(year, 12, 31).sunday?
128
+ end
129
+ private_class_method :last_week_of_year_has_sunday
130
+
131
+ def self.last_week_of_year_has_monday(year)
132
+ Date.new(year, 12, 29).monday? or
133
+ Date.new(year, 12, 30).monday? or
134
+ Date.new(year, 12, 31).monday?
135
+ end
136
+ private_class_method :last_week_of_year_has_monday
137
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mysql_yearweek
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dean Morin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-26 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! " MySQL's `yearweek` function has eight different modes for determining
15
+ the\n yearweek. This will get the same yearweek for each mode, with `4` being
16
+ the\n default mode.\n"
17
+ email: morin.dean@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/mysql_yearweek.rb
23
+ homepage: http://github.com/deanmorin/mysql_yearweek
24
+ licenses:
25
+ - MIT
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.23
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Returns yearweek values equivalent to the MySQL function
48
+ test_files: []