我有一个表设置,例如
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 |
注意:我没有尝试选择表格或将值更改为日期时间。我试图做的就是翻转数字并更新我的表,如果可能的话。
答案 0 :(得分:1)
假设我们的日期列为char
或varchar
,您可以执行以下操作
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,但希望这可以让你开始。