/
313.txt
243 lines (158 loc) · 9.79 KB
/
313.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
[28] [[SQL]] [[データベース]]において[[日時]]は重要な[[データ型]]です。
[[SQL]] の他の部分と同じように、また他の[[プラットフォーム]]の[[日時表現]]と同じように、
[[実装]]ごとに多種多様に取り扱われていて、[[可搬性]]はそれほど高くありません。
* 0値
[3] 特別な値として、[[日付]] [DFN[[CODE[0000-00-00]]]] や[[時刻]] [DFN[[CODE[00:00:00]]]]、[[日時]]
[DFN[[CODE[0000-00-00 00:00:00]]]]、[[年]] [DFN[[CODE[0000]]]] が使われています。
[4] [CODE[2009-'''00-00''']] のように[[月日]]を [N[0]] としたり、
[CODE[2009-01-'''00''']] のように[[日]]を [N[0]] としたりもできます [SRC[>>2]]。
* 年
[5] 69年までを2000年代、70年からを1900年代として扱います。
;; [[2桁西暦年号の解釈]]参照。
[40] [[MySQL]] では[[紀元前]]は扱えません。
[41] [[PostgreSQL]] と [[Oracle]] では[[紀元前]]の表現方法が異なります。
;; [[紀元前]]参照。
* 暦
[1] [[MySQL]] と [[PostgreSQL]] は、[[先発グレゴリオ暦]]を採用しています。
;; [[先発グレゴリオ暦]]参照。
[39] [[Oracle]] は、最初の[[グレゴリオ暦]]への[[改暦]]より前は、[[先発ユリウス暦]]を採用しています。
* 時間帯
[9] [[MySQL]] は [[tzdata]] を使っています [SRC[>>7, >>8]]。
[10] [[tzdata]] の主たる形式の他、[[閏秒]]オプション版も提供されています。
;; [[閏秒]]処理の違いについては [[tzdata]] 参照。
[11] [[tzdata]] の名前の他に、
[[システム時間帯]]を表す [DFN[[CODE[SYSTEM]]]] や、
[CODE[+10:00]] や [CODE[-6:00]] のような[[時差]]の表記にも対応しています [SRC[>>8]]。
-*-*-
[24] [[PostgreSQL]] は [[tzdata]] と [[POSIX時間帯]]を使っています [SRC[>>23, >>25, >>26]]。
-*-*-
[37] [[Oracle]] は[[tzdata]]を使っています [SRC[>>36]]。
-*-*-
[17] [[SQL]] では[[時間帯を持たない日時]]の[[データ型]]が使われることも多いです。
[[SQL]] 内での[[時間帯]]を持つ[[データ型]]との変換時や、
[[SQL]] を使う[[プログラミング言語]]等での[[時間帯]]を持つ[[データ型]]との変換時に、
取り扱いに注意が必要となります。
[18] [[時間帯を持たない日時]]の[[データ型]]と [[Unix time]]
との相互変換の手段が提供されていることがありますが、その場合の [[Unix time]]
は本来の [[UTC]] 基準の値ではなく、[[地方時]]基準の値になります。
* 日数と秒数
[13] [[MySQL]] の [CODE[TO_DAYS]] は[[日数]]、 [CODE[TO_SECONDS]] は[[秒数]]を返します。
[14] [TIME[0000年1月1日][0000-01-01]]の[[日数]]は [N[1]] です [SRC[>>12]]。
;; [42] これは [[MATLAB]] の [CODE[datenum]] と同じ数え方です。
[15] [TIME[0000年1月1日][0000-01-01]]の[[秒数]]は [N[86400]] です [SRC[>>12]]。
これは[[正子]]を表しているようなので、その1日前からの[[秒数]]ということになります。
* 異なる時代の日時の扱い
[27] [[過去の日時]]、[[将来の日時]]も参照。
* 時間形式
[22] [[PostgreSQL]] は独自の[[時間形式]]
([CODE[reltime]], [CODE[timestamp]] も参照。) と [[ISO 8601の時間形式]]に対応しています
[SRC[>>23]]。
* データ型
[FIG(short list)[ [6]
- [CODE[YEAR]]
- [CODE[DATE]]
- [CODE[DATETIME]]
- [CODE[TIMESTAMP]]
]FIG]
* メモ
[2] [CITE@en[MySQL :: MySQL 8.0 Reference Manual :: 12.3 Date and Time Types]] ([TIME[2017-03-10 16:41:32 +09:00]]) <https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html>
[7] [CITE@en[MySQL :: Time zone description tables]] ([TIME[2017-03-10 16:55:11 +09:00]]) <https://dev.mysql.com/downloads/timezones.html>
[8] [CITE@en[MySQL :: MySQL 8.0 Reference Manual :: 11.6 MySQL Server Time Zone Support]] ([TIME[2017-03-10 16:55:59 +09:00]]) <https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html>
[12] [CITE@en[MySQL :: MySQL 8.0 Reference Manual :: 13.7 Date and Time Functions]] ([TIME[2017-03-10 17:23:58 +09:00]]) <https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html>
[19] [CITE@en[PostgreSQL: Documentation: 9.6: Date/Time Types]] ([TIME[2017-03-10 17:45:06 +09:00]]) <https://www.postgresql.org/docs/current/static/datatype-datetime.html>
[16] [CITE@en[PostgreSQL: Documentation: 9.6: Date/Time Functions and Operators]]
([TIME[2017-03-10 17:35:44 +09:00]])
<https://www.postgresql.org/docs/current/static/functions-datetime.html>
[23] [CITE@en[PostgreSQL: Documentation: 9.6: Date/Time Types]] ([TIME[2017-03-10 17:52:45 +09:00]]) <https://www.postgresql.org/docs/current/static/datatype-datetime.html>
[25] [CITE@en[PostgreSQL: Documentation: 9.6: pg_timezone_abbrevs]] ([TIME[2017-03-10 17:55:40 +09:00]]) <https://www.postgresql.org/docs/current/static/view-pg-timezone-abbrevs.html>
[26] [CITE@en[PostgreSQL: Documentation: 9.6: Date/Time Configuration Files]] ([TIME[2017-03-10 17:55:50 +09:00]]) <https://www.postgresql.org/docs/current/static/datetime-config-files.html>
[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[PostgreSQL: Documentation: 9.6: Date/Time Types]]
([TIME[2017-03-10 17:47:48 +09:00]])
<https://www.postgresql.org/docs/current/static/datatype-datetime.html>
]FIGCAPTION]
> ISO ISO 8601, SQL standard 1997-12-17 07:37:16-08
> SQL traditional style 12/17/1997 07:37:16.00 PST
> Postgres original style Wed Dec 17 07:37:16 1997 PST
> German regional style 17.12.1997 07:37:16.00 PST
]FIG]
[FIG(quote)[
[FIGCAPTION[
[21] [CITE@en[PostgreSQL: Documentation: 9.6: Date/Time Types]]
([TIME[2017-03-10 17:48:18 +09:00]])
<https://www.postgresql.org/docs/current/static/datatype-datetime.html>
]FIGCAPTION]
> SQL, DMY day/month/year 17/12/1997 15:37:16.00 CET
> SQL, MDY month/day/year 12/17/1997 07:37:16.00 PST
> Postgres, DMY day/month/year Wed 17 Dec 07:37:16 1997 PST
]FIG]
[29] [CITE@ja[日付/時刻型]]
([TIME[2017-03-10 18:50:07 +09:00]])
<https://msdn.microsoft.com/ja-JP/library/ff848733.aspx>
[FIG(quote)[
[FIGCAPTION[
[30] [CITE@en[date (Transact-SQL)]]
([TIME[2017-03-10 18:52:14 +09:00]])
<https://msdn.microsoft.com/en-us/library/bb630352.aspx>
]FIGCAPTION]
> For Informatica, the range is limited to 1582-10-15 (October 15, 1582 CE) to 9999-12-31 (December 31, 9999 CE).
]FIG]
[FIG(quote)[
[FIGCAPTION[
[31] [CITE@en[datetime (Transact-SQL)]]
([TIME[2017-03-10 18:53:05 +09:00]])
<https://msdn.microsoft.com/en-us/library/ms187819.aspx>
]FIGCAPTION]
> January 1, 1753, through December 31, 9999
]FIG]
[FIG(quote)[
[FIGCAPTION[
[32] [CITE@en[datetime2 (Transact-SQL)]]
([TIME[2017-03-10 18:54:29 +09:00]])
<https://msdn.microsoft.com/en-us/library/bb677335.aspx>
]FIGCAPTION]
> 0001-01-01 through 9999-12-31
]FIG]
[FIG(quote)[
[FIGCAPTION[
[33] [CITE@en[smalldatetime (Transact-SQL)]]
([TIME[2017-03-10 18:56:22 +09:00]])
<https://msdn.microsoft.com/en-us/library/ms182418.aspx>
]FIGCAPTION]
> 1900-01-01 through 2079-06-06
]FIG]
[FIG(quote)[
[FIGCAPTION[
[34] [CITE@ja[グレゴリオ暦?ユリウス暦? データベースによって異なる、日付時刻型が扱える範囲 | ユニリタブログ]]
([TIME[2017-03-10 18:24:03 +09:00]])
<http://www.unirita.co.jp/blog/data-utilization/data-linkage/20141216.html>
]FIGCAPTION]
> 大英帝国では、1752年の9月にユリウス暦からグレゴリオ暦に改暦しています。そのため、1752年9月には19日しか存在しません。改暦を跨いで対応できるようにすると大変なので、Sybase SQL Serverでは、グレゴリオ暦になってからの日付を扱うように、改暦の翌年である1753年を日付時刻型が扱える範囲の開始年としました。そして、それをMicrosoft SQL Serverも引き継いでいる、ということです。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[35] [CITE@en[PostgreSQL: Documentation: 9.2: Date/Time Types]]
([TIME[2017-03-10 19:30:22 +09:00]])
<https://www.postgresql.org/docs/9.2/static/datatype-datetime.html>
]FIGCAPTION]
> When timestamp values are stored as eight-byte integers (currently the default), microsecond precision is available over the full range of values. When timestamp values are stored as double precision floating-point numbers instead (a deprecated compile-time option), the effective limit of precision might be less than 6. timestamp values are stored as seconds before or after midnight 2000-01-01. When timestamp values are implemented using floating-point numbers, microsecond precision is achieved for dates within a few years of 2000-01-01, but the precision degrades for dates further away. Note that using floating-point datetimes allows a larger range of timestamp values to be represented than shown above: from 4713 BC up to 5874897 AD.
]FIG]
[36] [CITE@ja[データ型]]
([TIME[2017-02-24 10:24:15 +09:00]])
<https://docs.oracle.com/cd/E57425_01/121/SQLRF/sql_elements001.htm>
[FIG(quote)[
[FIGCAPTION[
[38] [CITE[質問!ITmedia - Oracle11gのDATE型]]
([TIME[2017-03-10 19:59:40 +09:00]])
<http://qa.itmedia.co.jp/qa4798316.html>
]FIGCAPTION]
> Oracle はユリウス日 (紀元前4713年1月1日) からの経過日数+秒で日付データ
> を管理しています。
> 紀元前4713年1月1日から2009年3月15日の経過日数は、2454906日です。
> こでに、11:42 は (午前とすると) 経過秒は42120秒となります。
> 1日は、86400 秒なので0.4875 となり、2454906.4875 として格納されます。
]FIG]
[43] [CITE@ja-jp[datetime (Transact-SQL) - SQL Server | Microsoft Docs]]
([[MikeRayMSFT]]著, [TIME[2019-05-11 12:59:58 +09:00]])
<https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-2017>