更新要翻转的表中的字符串值,例如YYYYMMDD字符串到MMDDYYYY字符串

时间:2014-04-17 19:06:43

标签: sql sql-server-2008

我有一个表设置,例如

CREATE TABLE Test_Table ( ID int, 日期varchar(8) );

我的表在选择时看起来像这样

|   ID    |    Dates   |
------------------------
|    1    |  20140911  |
|    2    |  20140101  |
|    3    |  20140829  |

我试图更新我的表,以便字符串值为MMDDYYYY而不是YYYYMMDD 例如,这就是我想要实现的目标:

|   ID    |    Dates   |
------------------------
|    1    |  09112014  |
|    2    |  01012014  |
|    3    |  08292014  |

注意:我没有尝试选择表格或将值更改为日期时间。我试图做的就是翻转数字并更新我的表,如果可能的话。

2 个答案:

答案 0 :(得分:1)

假设我们的日期列为charvarchar,您可以执行以下操作

update foo
set dates = right(dates,4) + left(dates,4)

或者这个

update foo
set dates = replace( convert(varchar,convert(datetime,dates,112),110) , '-' , '' )

如果你想做的只是显示你的文字不同,最简单的方法是

select ... ,
       dates = right(dates,4) + left(dates,4)
from foo

或者创建一个视图并使用它代替原始表:

create view foo_view
as select id ,
          dates = right(dates,4) + left(dates,4)
   from foo

但是,如果您使用实际的日期/时间数据类型,您的数据用户将把它们映射到客户端中的合适日期/时间类型,然后可以选择最适合他们需要的显示方式。

使用日期/时间类型的另一个好处是它们可以强制执行数据完整性。等到有人添加或更改日期以使其无效 - 例如,`20142331'。然后,当您需要在具有月份名称的表单中显示该数据时(例如,2014年1月22日),当您尝试将月份号码映射到月份名称时,将会出现欢闹。

如果您不打算使用日期/时间类型,则将年,月和日各自作为整数值存储,并使用适当的检查约束来强制执行完整性:

create table foo
(
  id   int not null identity(1,1) primary key ,
  yyyy int not null check ( yyyy between 1900 and 2100 ) ,
  mm   int not null check ( mm between 1 and 12 ) ,
  dd   int not null check ( dd between 1 and ( case mm
                                                 when  4 then 30
                                                 when  6 then 30
                                                 when  9 then 30
                                                 when 11 then 30
                                                 when  2 then case
                                                                when yyyy % 400 = 0 then 29
                                                                when yyyy % 100 = 0 then 28
                                                                when yyyy % 4   = 0 then 29
                                                                else                     28
                                                              end
                                                 else 31
                                               end
                                             )
                          )

答案 1 :(得分:0)

最直接的方法是将字符串转换为日期,然后在更新语句中以所需格式退出。

不幸的是我目前无法运行任何代码,因此我可能提供的任何示例代码都可能无益,但希望这些链接可以帮助您。可能有必要执行直接字符串操作,因为我注意到sql server 2008似乎缺少“日期掩码”样式的转换。 http://msdn.microsoft.com/en-us/library/ms180878(v=sql.100).aspx http://msdn.microsoft.com/en-us/library/ms187928.aspx

请注意,这是您通常将日期存储为日期对象的正当理由。在select语句中以您想要的格式创建输出字符串是非常简单的,但是当它作为原始字符存储时会更复杂。

对不起这个答案并不是更好;我的主要经验是在Oracle,但希望这可以让你开始。