SQL 数据类型转换 日期由数字型numeric(18, 0)转换为datetime型

我知道numeric(18,0)是18位有效数字的数字型,如201307;datetime型是年月日:时分秒,如:2013-7-1112:38:01。我现在的问题是如何将... 我知道numeric(18, 0)是18位有效数字的数字型,如201307;
datetime型是年月日:时分秒,如:2013-7-11 12:38:01。

我现在的问题是如何将数值型201307,转变成datetime型的2013-7-1:00:00:00。
数据是有点不全,数字型的数据只给到“月”,后面的“日”、“小时”、“分”、“秒”什么的都没有。但是可以“默认”,即只精确到“月”就可,后面的可以随便填。

我要做一个按月来查询的查询功能,而且必须是datetime型的日期,但他们给我的数据库里的日期却是numeric(18, 0)。
下面是数据截图:
这个是numeric(18, 0)型日期,

这个是他的数据类型截图

这是datetime型
我试过直接在“修改”里面把numeric(18, 0)改为datetime型,能改,但是数据变了:

我也在百度上找了很久,都没找到有效方法。速求解决,已给最高悬赏。
我会每半个小时过来看一次。

可别跟我说手动一个一个去改,数据太多了,如果手动改的话,要改到何年何月啊。
展开
 我来答
walkmens
2013-07-11 · TA获得超过452个赞
知道小有建树答主
回答量:489
采纳率:100%
帮助的人:266万
展开全部
第一步:你做错了,他们给的这个数据类型根据你的需求根本用不着更改为datetime,为什么会变成这样也是因为这个数据根本就不能转成datetime模式
/* 接下来。。。。。重新恢复你的数据类型为 numeric(18, 0) 看数据能不能恢复原来的样子 或着用下面二位的用法,再根据year和month取值,我建议先试前面一种(因为这是人家给你的数据,不能乱改,万一人家在其它地方有引用,人家问起来你就不好回了) */

前面一种按年月来查询可以这样写
select left(fyearmonth,4),right(left,2),sum(qty) from tb
group by left(fyearmonth,4),right(left,2)
匿名用户
2013-07-11
展开全部
-- 模拟你的 原始表 和原始数据.
CREATE TABLE #test (
  test numeric(18, 0)
);
GO

INSERT INTO #test VALUES('201212')
INSERT INTO #test VALUES('201301')
GO

-- 模拟修改数据类型.
ALTER TABLE #test ALTER COLUMN test DATETIME;
GO

-- 查询数据 (应该是不正确的)
SELECT * FROM #test 
GO

test
-----------------------
2450-11-25 00:00:00.000
2451-02-22 00:00:00.000

(2 行受影响)


-- 修正数据之前的查询处理.
SELECT
  DATEADD(mm,  (DATEDIFF(dd,  '1900-01-01', test) % 100) -1,
    DATEADD(yy, DATEDIFF(dd,  '1900-01-01', test) / 100 - 1900, 0))
FROM
  #test;
GO

-----------------------
2012-12-01 00:00:00.000
2013-01-01 00:00:00.000

(2 行受影响)


-- 满足预期, 正式作更新处理.
UPDATE
  #test
SET
  test = DATEADD(mm,  (DATEDIFF(dd,  '1900-01-01', test) % 100) -1,
    DATEADD(yy, DATEDIFF(dd,  '1900-01-01', test) / 100 - 1900, 0));
GO

-- 数据核对.
SELECT * FROM #test;
GO

test
-----------------------
2012-12-01 00:00:00.000
2013-01-01 00:00:00.000

(2 行受影响)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
szm341
推荐于2018-03-21 · TA获得超过6726个赞
知道大有可为答主
回答量:5005
采纳率:100%
帮助的人:5169万
展开全部
先将数据类型改成varchar,然后将所有数据拼接01,update
最后将数据类型修改为datetime,用varchar类型做一个中间转接
追问
然后将所有数据拼接01,update??
怎么做啊 不懂。。
追答
update tb set 字段=字段+'01'就是字符拼接喽,然后再修改数据类型
alter table tb
alter column tb datetime
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
虎嗅蔷薇的李小多
2013-07-11
知道答主
回答量:21
采纳率:0%
帮助的人:16.2万
展开全部
1。你先新建一列名字叫FYearMonth2 , datetime的
2.执行
update tablename
set FYearMonth2=convert(datetime,
left(cast(fyearmonth as varchar(6)),4) + '-' + right(cast(fyearmonth as varchar(6)),2) + '-01 00:00:00',120)

3. 删除原来叫FYearMonth的列
4. 把FYearMonth2改为FYearMonth
追问
这么多大神啊 不过你这种方法他先提出。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
micro0369
2013-07-11 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4065万
展开全部
select convert(datetime,
left(cast(fyearmonth as varchar(6)),4) + '-' + right(cast(fyearmonth as varchar(6)),2) + '-01 00:00:00',120)
from xxxx
更多追问追答
追问
你这个是查询语句啊,没有改变表结构。。。
追答
首先,你在表里先加一列:   fyearmonth2  datetime类型

接着,用我上面的语法,update fyearmonth2列
update xxxx set fyearmonth2=convert(datetime,
left(cast(fyearmonth as varchar(6)),4) + '-' + right(cast(fyearmonth as varchar(6)),2) + '-01 00:00:00',120)

然后,你删除掉 fyearmonth 列

最后,将 fyearmonth2 列名改为 fyearmonth
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式