mysql_yearweek 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/mysql_yearweek.rb +137 -0
- 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: []
|