ã·ã¹ãã ãããç¶æ
ããå¥ã®ç¶æ
ã«å€æããããšæ³åããŠãã ããã åæç¶æ
ã¯ãDateTimeãCïŒã³ãŒããšããŒã¿ããŒã¹ã§ã©ãã§ã䜿çšããããšãã§ãã æçµç¶æ
ã¯ãDateTimeOffsetãã©ãã§ã䜿çšããããšãã§ãã 移è¡ãã¹ã ãŒãºã«è¡ããã§ããã ãå°ãªãå€æŽãå ããããšèããŠããŸãã ãã®èª¬æã¯ãæåŸã«è¡ãæ¢ãŸãã®éåžžã«èå³æ·±ãã¿ã¹ã¯ã®å§ãŸããããããŸããã
DateTimeåã¯ãå°ãåã®æ¥ä»ãšæå»ãæäœããããã®ããã©ã«ãã®.NETåã§ãããéåžžããã®åšãã«æ§ç¯ãããããžãã¯ã¯ãå€æŽãããªãããã«äœæãããŸããã ã¿ã€ãã1ã¹ãããã§å€æŽããããšãããšãã·ã¹ãã ã®ã»ãŒãã¹ãŠã®éšåã§ã«ã¹ã±ãŒãå€æŽãçºçããŸãã 極端ãªå Žåã1ã€ã®ãã£ãŒã«ãã®ã¿ã§çŽ200ã®ã¹ãã¢ãããã·ãŒãžã£ãå€æŽããå¿
èŠããããŸãã ãããæåã®åé¡ã§ãã 2çªç®ã®åé¡ã¯ããã¹ãäžã«ãã®ãããªå€æŽã®çµæãèŠã€ããã®ãé£ããããšã§ãã ååž°ãã¹ãã§ã¯ãäœããèŠéããªãããšããã·ã¹ãã ãæ©èœããããšãä¿èšŒããŸããã äœæ¥ããã«ã€ããŠå¿
èŠãªå質ä¿èšŒã®åªåãå¢ãããã€çµäºããã®ãæ確ã«ç解ã§ããªããªããŸãã
ç§ã®ç 究äžã«ãç§ã¯ãã®ãããªå€æãžã®å¯èœãªã¢ãããŒããèŠã€ããŸããã ãã®ã¢ãããŒãã«ã¯3ã€ã®æ®µéããããã·ã¹ãã ãçŸåšã¿ã€ã ãŸãŒã³ããµããŒãããŠãããããã¹ãŠã®ãµãã·ã¹ãã ãåãã¿ã€ã ãŸãŒã³ã«ãããšããä»®å®ã«åºã¥ããŠããŸãã
- ãã¢ã®èšç®ãã£ãŒã«ããè¿œå ããŠãããŒã¿ããŒã¹ããDateTimeOffsetå€ãèªã¿åããŸãã
- èªã¿åãæäœã®å€æãè¡ããŸãã
- æžã蟌ã¿æäœã®å€æãè¡ããŸãã
ãã®ã¢ãããŒãã¯ãå€æŽãããŒã«ã©ã€ãºããQAã®åªåãå¶éããã®ã«åœ¹ç«ã¡ãŸãã ãŸããå°æ¥ã®äœæ¥ãè©äŸ¡ããããã®åªããäºæž¬å¯èœæ§ãæäŸããŸãã 以äžã«æé ã詳现ã«èª¬æããŸãã
æªãã¢ãããŒã
æ¥ä»/æå»ã®å€ã«é¢é£ä»ããããçŽ150ã®ãã£ãŒã«ãããããšããŸãã 次ã®SQLã¹ã¯ãªããã䜿çšããŠãããŒã¿ããŒã¹å
ã®å®å
šãªãªã¹ããèŠã€ããããšãã§ããŸãã
select tbl.name as 'table', col.name as 'column', tp.name as 'type', def.name as 'default' from sys.columns col inner join sys.tables tbl on tbl.[object_id] = col.[object_id] inner join sys.types tp on tp.system_type_id = col.system_type_id and tp.name in ('datetime', 'date', 'time', 'datetime2', 'datetimeoffset', 'smalldatetime') left join sys.default_constraints def on def.parent_object_id = col.[object_id] and def.parent_column_id = col.column_id order by tbl.name, col.name
ããŒã¿ããŒã¹ã§ã¯ãDateTimeããDateTimeOffsetãžã®å€æãããã³ãã®éã®å€æãéåžžã«åªããã¬ãã«ã§ãµããŒããããŠããŸãããCïŒã³ãŒãã§ã¯ãå
¥åã®ããã«ããã¯å°é£ã§ãã ããŒã¿ããŒã¹ãDateTimeOffsetå€ãè¿ãå ŽåãDateTimeå€ãèªã¿åãããšã¯ã§ããŸããã 1ã€ã®ãã£ãŒã«ãã®æ»ãå€ã®åãå€æŽããå Žåãã·ã¹ãã å
šäœã§äœ¿çšããããã¹ãŠã®å Žæãå€æŽããå¿
èŠããããŸãã å Žåã«ãã£ãŠã¯ãã·ã¹ãã ãéåžžã«å€§ããå Žåã¯äžéšã®å Žæãç¥ããªãå¯èœæ§ããããããããã¯åã«äžå¯èœã§ãã ãã®ãããåçŽãªãã£ãŒã«ãã¿ã€ãã®å€æŽã䌎ãã¢ãããŒãã¯æ©èœããŸããã 次ã®ã¹ã¯ãªããã䜿çšããŠãããŒã¿ããŒã¹å
ã®ç¹å®ã®ããŒãã«ãã£ãŒã«ãã®ãã¹ãŠã®äœ¿çšãèŠã€ããããšãã§ããŸãã
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%table%' OR ROUTINE_DEFINITION LIKE '%field%' AND ROUTINE_TYPE='PROCEDURE'
å€æãè¡ãã«ã¯ãã·ã¹ãã ã®ã©ã®éšåã圱é¿ãåããããäºåã«äºæž¬ããããšãéèŠã§ãã æ®ãã®éšåã«éåããããšãªããã·ã¹ãã ã®ç¹å®ã®ã¢ãžã¥ãŒã«ã®å€æŽãããŒã«ã©ã€ãºããã¢ãããŒããå¿
èŠã§ãã
ããè¯ãã¢ãããŒã
ãã®ã¢ãããŒãã¯åã«ãããè¯ãããã®ã§ãããæè¯ã®æ¹æ³ã§ã¯ãããŸããã å°æ¥ãããã€ãã®åé¡ãçºçããããšãæåŸ
ããŠããŸããã以åã®åé¡ãããå®å
šã«èŠããŸãã äž»ãªéãã¯ã1ã¹ãããã§å€æãå®è¡ããªãããšã§ãã ç¶æ³ã®å¶åŸ¡ãå¯èœã«ããäžé£ã®åŸå±å€æŽããããŸãã
èšç®ãã£ãŒã«ãã®äœæ
èšç®ãããéè€ãã£ãŒã«ããããŒã¿ããŒã¹ã«è¿œå ããå Žåãå¿
èŠãªã¿ã€ãã®æ°ãããã£ãŒã«ããå
¥åããŸãã ããã«ãããèªã¿åããæžã蟌ã¿ãæŽæ°ãããã³ãŒããå€ãã³ãŒãããåé¢ã§ããŸãã ãã®æäœã¯ã¹ã¯ãªããã䜿çšããŠç°¡åã«å®è¡ã§ããå質ä¿èšŒã®åªåã¯å¿
èŠãããŸããã
declare @table sysname, @column sysname, @type sysname, @default sysname declare cols cursor for select tbl.name as 'table', col.name as 'column', tp.name as 'type', def.name as 'default' from sys.columns col inner join sys.tables tbl on tbl.[object_id] = col.[object_id] inner join sys.types tp on tp.system_type_id = col.system_type_id and tp.name in ('datetime', 'date', 'time', 'datetime2', 'smalldatetime') left join sys.default_constraints def on def.parent_object_id = col.[object_id] and def.parent_column_id = col.column_id order by tbl.name, col.name open cols fetch from cols into @table, @column, @type, @default while @@FETCH_STATUS = 0 begin declare @cmd nvarchar(max) set @cmd = 'alter table ['+@table+'] add ['+@column+'_dto] as todatetimeoffset(['+@column+'], ''+00:00'')' exec (@cmd) fetch from cols into @table, @column, @type, @default end close cols deallocate cols
äžèšã®çµæã«åºã¥ããŠãDateTimeOffsetãå
¥åããã»ã¯ã·ã§ã³ã«ã·ã¹ãã ãã¹ã©ã€ã¹ã§ããŸãã ããã§ãé¢é£ãããã¹ãŠã®å Žæãå€æŽããããšãªãã1ã€ã®ã¹ãã¢ãããã·ãŒãžã£ã§ã®ã¿æ°ããåã䜿çšã§ããŸãã
èªæžå€æ
èªã¿åãæäœã¯ãã¯ã©ã€ã¢ã³ãã³ãŒããšããŒã¿ããŒã¹éã®çµ±åã«äœ¿çšãããã¢ãããŒãã®ãããå€æãæãå°é£ã§ããããšãå€æããŸããã æ¥ä»/æå»ã®å€ã¯ãæååã®ã·ãªã¢ã«åãéããŠæž¡ãããŸãã DateTimeOffsetã®åœ¢åŒã¯ç°ãªããã¯ã©ã€ã¢ã³ãåŽã®DateTimeå€æ°ã§ã¯ããã©ã«ãã§èªã¿åãããšãã§ããŸããã åæã«ãæžã蟌ã¿æäœã¯æ©èœããŸãã DateTimeå€ãåŒæ°ãŸãã¯DateTimeOffsetãã£ãŒã«ãã«æž¡ããšããã®å€ã¯UTCã«èª¿æŽãããŠãããšããåæã§åãå
¥ããããŸãã å€æåŸã®æéãªãã»ããã¯ã+00ïŒ00ãã«ãªããŸãã
ããã§ãã·ã¹ãã ã®äžéšãåãåºããŠãã¯ã©ã€ã¢ã³ãã³ãŒãã§DateTimeãè¿ãã¹ãã¬ãŒãžã®æ£ç¢ºãªæ°ãç¹å®ã§ããŸãã ããã§ã¯ãDateTimeOffsetå€ãèªã¿åãããã«ãCïŒã³ãŒãã®èªã¿åãæäœãå€æŽããå¿
èŠããããŸãã ãŸããããŒã¿ããŒã¹ã®ã¹ãã¬ãŒãžèªäœãå€æŽããŠãæ°ããèšç®ãã£ãŒã«ãããå€ãè¿ãããã«ããå¿
èŠããããŸãã ãã®ã¹ãããã§æåŸ
ãããçµæã¯æ¬¡ã®ãšããã§ãã
- CïŒã³ãŒãã¯DateTimeOffsetãèªã¿åããå¯èœãªéãã·ã¹ãã ããå€ãè¿ãããã«ãã®åã䜿çšããŸãã
- ããŒã¿ããŒã¹ã¹ãã¬ãŒãžã¯åŒæ°ã§DateTimeOffsetã䜿çšããCïŒã³ãŒãã¯DateTimeOffsetããããã«æž¡ããŸãã
- æ°ããã¿ã€ãã¯ããŒã¿ããŒã¹å
ã§äœ¿çšãããŸãã
- ããŒã¿ããŒã¹ã¹ãã¬ãŒãžã¯ãæ°ããè¿œå ããããã£ãŒã«ãããå€ãè¿ããŸãã
ãã®çµæãæ°ãããã£ãŒã«ãããããŒã¿ãèªã¿åããå€ããã£ãŒã«ãã«å€ãä¿åããã·ã¹ãã ãåŸãããŸãã ããã§ãèšé²æäœã§ã¿ã€ã ãªãã»ããã転éãããã·ã¹ãã ã«ä¿åããããšããã«ãã·ã¹ãã å
šäœãã¿ã€ã ãŸãŒã³ã§æ£ããåäœãå§ããŸãã
å€æã¬ã³ãŒã
ããã§ãã·ã¹ãã ã®æéãªãã»ãããä¿®æ£ããããŒã¿ããŒã¹ã«éä¿¡ããŠããã£ãŒã«ãã«ä¿åããå¿
èŠããããŸãã å€ããã£ãŒã«ããååŸããŠãæ°ãããã£ãŒã«ãããèšç®ãã£ãŒã«ãã«å€æŽããå¿
èŠããããæ°ãããã£ãŒã«ãã«ã¯å€ãå«ãŸããããã«ãªããŸãã ãã§ã«ããããèªãã§ããŸãããä»ã§ã¯å€ãæžãçããŠããŸãããããŠãå€ããã®ã¯éã«ããã èªãã§ããŸãã ãã®ã¢ãããŒãã¯ãç¹å®ã®ã»ã¯ã·ã§ã³ã®å€æŽã®ã¿ãåé¢ããã®ã«åœ¹ç«ã¡ãŸãã äºæ³ãããçµæã¯æ¬¡ã®ãšããã§ãã
- CïŒã³ãŒãã¯DateTimeOffsetå€ãäœæããããŒã¿ããŒã¹ã«æž¡ããŸã
- æ°ãããã£ãŒã«ãã¯å€ãæã€å®ãã£ãŒã«ãã«ãªããŸãã
- å€ããã£ãŒã«ããèšç®ãããèªã¿åãã«äœ¿çšãããããã«ãªããŸããã
- ããŒã¿ããŒã¹ã¹ãã¬ãŒãžã¯ãæ°ãããã£ãŒã«ãã«å€ãä¿åããŸã
æçµçã«ãæ°ããDateTimeOffsetåãèªã¿æžãããã·ã¹ãã ã«ãªããŸãã ãã®ã¿ã€ãã«ã¯ãã¿ã€ã ãªãã»ããã®ãµããŒããçµã¿èŸŒãŸããŠãããããéåžžãUTCãŸãã¯ã¿ã€ã ãŸãŒã³éã§æåã§å€æããå¿
èŠã¯ãããŸããã
ãããªãã¹ããã
ã·ã¹ãã ãå€æçšã®ã»ã¯ã·ã§ã³ã«åå²ããããšã«é¢ããŠç§ãã§ããå¯äžã®æšå¥šäºé
ã¯æ¬¡ã®ãšããã§ãã䜿çšããã¹ãã¬ãŒãžã«å¿ããŠã¢ãžã¥ãŒã«ãååã«åé¢ããå¿
èŠããããŸãã ãããã£ãŠãåªåã®äºæž¬å¯èœæ§ãéæããããããäºåã«è©äŸ¡ã§ããããã«ãªããŸãã 確ãã«ãããã€ãã®åé¡ã¯ãŸã çºçããå¯èœæ§ããããŸãããäœæ¥äžã¯éªçã®ããã«ã¯æé·ããŸããã åŸã§ãå€ããã£ãŒã«ããåãé€ãããšãã§ããŸãã ã¿ã€ã ãŸãŒã³ã«é¢ããæ
å ±ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãŸãã¯ãŠãŒã¶ãŒèšå®ããååŸã§ããŸãã 以äžã«ãããŒã¿ããŒã¹å
ã®2ã€ã®ã¿ã€ãã®äºææ§ã«é¢ããæ
å ±ãæçš¿ããŸããã
- åã¿ã€ããDateTimeããDateTimeOffsetã«å€æŽãããšãæé»çãªå€æãæ©èœããŸãã æéãªãã»ããã¯+00ïŒ00ã«ãªããŸãã å¥ã®ã¿ã€ã ãŸãŒã³ãæå®ããå¿
èŠãããå Žåã¯ãäžæåã䜿çšããå¿
èŠããããŸãã
- æååãžã®å€ã®ãã©ãŒãããããµããŒããããŠããŸãã
- ãµããŒããããŠãããã¹ãŠã®æŒç®åã«ããæ¯èŒã
- ãªã¹ã¯ã®ãªãSYSDATETIMEOFFSETïŒïŒã¯GETDATEïŒïŒã眮ãæããããšãã§ããŸã
- DateTimeãšDateTimeOffsetéã®å²ãåœãŠã¯ãæé»çãªå€æã§æ©èœããŸãã
éå¶ | T-SQL | 解説 |
---|
DateTimeãDateTimeOffsetã«å€æ | TODATETIMEOFFSETïŒdatetime_fieldãã+ 00ïŒ00ãïŒ | ãªãã»ãããè¿œå ããŠå€ãååŸ+00ïŒ00 |
DateTimeOffsetãDateTimeã«å€æ | CONVERTïŒDATETIMEãdatetimeoffset_fieldïŒ -ãŸãã¯-SET @datetime = @datetimeoffset | ãªãã»ããæ
å ±ã¯å€±ãããŸãã å€æäžããªãã»ããã¯åã«ç¡èŠãããŸãã ããšãã°ãã2017-04-05 10:02:00 +01ïŒ00ãã®å Žåãã2017-04-05 10:02:00ãã«ãªããŸãã |
çŸåšã®æ¥ä»/æå» | SWITCHOFFSETïŒSYSDATETIMEOFFSETïŒïŒã '+ 00ïŒ00'ïŒ | ãããã¯2ã€ã®ããŒã ã§ãã çµæã¯UTCãŸãŒã³ã®ãã€ã³ãã«ãªããŸã |
çµã¿èŸŒã¿ã®æäœ | DATEPARTãDATEDIFFãBETWEENã<ã>ã=ãªã© | DATEDIFFãBETWEENãããã³æ¯èŒæäœã¯ãUTCãªãã»ãããæã€å€ãšããŠè¡šãããDateTimeå€ã§ãæéãªãã»ãããèæ
®ã«å
¥ããŸã |
æžåŒèšå® | CONVERTïŒNVARCHARãdatetimeoffset_fieldã103ïŒ | DateTimeã®å ŽåãšåãçµæãååŸããŸãã |
ã·ã¹ãã ã§ãã§ã«ãããè¡ã£ã人ãã¡ããããã®ãããªå€åã«ã€ããŠã®è©±ãèãã®ã¯éåžžã«èå³æ·±ãã§ãã ãŸããã·ã¹ãã å
ã®ã¿ã€ã ãŸãŒã³ã誰ãã©ã®ããã«ãµããŒãããŠãããã