【问题标题】:converting date data type into varchar将日期数据类型转换为 varchar
【发布时间】:2011-01-03 06:18:24
【问题描述】:

我在表中有一些日期字段。这些列包含以下格式的日期:

mmddyy

例如:

31/12/2010 00:00:00:0000

我需要将这些值导入一个设置为 varchar 和 numeric 的表中,并像这样格式化日期:

monthName varchar
Year numeric(4,0)

目前我正在使用

INSERT INTO [School].[dbo].[TeacherAttendenceDet] 
            ([TeacherCode], 
             [MonthName], 
             [Year]) 
(SELECT MAX(employeecode), 
        Datename(MONTH, dateofjoining) AS MONTH, 
        Datepart(YEAR, dateofjoining)  AS DATE 
 FROM   employeedet 
 GROUP  BY dateofjoining) 

但是datename() 以日期格式给出结果.. 我必须以varchar 格式保存它

我该怎么做? 这是employeemast 表:

EmployeeCode    numeric(5, 0)   
PayScaleCode    numeric(7, 0)   
DesignationCode varchar(50) 
CityCode    numeric(5, 0)   
EmployeeName    varchar(50) 
FatherName  varchar(50) 
BirthDate   varchar(50) 
DateOfJoining   varchar(50) 
Address varchar(150)    

这是 TeacherAttendenceDet 表

TeacherCode numeric(5, 0)   Unchecked
Year    numeric(4, 0)   Unchecked
MonthName   varchar(12) Unchecked

我必须在teacherattendencedet 表中插入来自employeemast 的月份名称和年份

【问题讨论】:

  • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮 ( { } ) 以很好地格式化语法高亮!
  • 这给出了写的一月.. 但是插入时给出了错误将 char 数据类型转换为 datetime 数据类型导致超出范围的 datetime 值。我必须分别存储月份名称和年份...我该怎么做?
  • 你也可以发布表格 DDL 吗?
  • 好的,所以问题确实是:你的datejoining 是一个varchar,但你想在它上面使用日期函数.....从错误信息来看,你的字符串没有t 总是包含一个有效的日期,要么......因为不幸的是,SQL Server 不支持您使用的格式......
  • yaaa...这是主要的错误....谢谢

标签: sql sql-server-2005


【解决方案1】:

如果我处于你的位置,我会做以下事情:

  • 通过添加 real DATETIME 列更新EmployeeMast 表:

    ALTER TABLE dbo.EmployeeMast
      ADD JoinDate DATETIME
    
  • 然后将datejoining 中的所有条目转换为新的日期时间列:

     UPDATE dbo.EmployeeMast
     SET JoinDate = CONVERT(DATETIME, SUBSTRING(datejoining, 1, 10), 103)
    
  • 然后删除旧列

      ALTER TABLE dbo.EmployeeMast DROP COLUMN datejoining
    

现在,一旦你有了DATETIME 列,你就可以开始使用日期函数了!

现在,您的 INSERT 语句应该可以工作了 - 因为它确实从 DATETIME 列中获取值,所以它将能够计算 DATENAME()DATEPART()

如果您想为每个条目的连接日期设置年份(数字形式)和月份(字符串形式),我建议您在表中添加两个计算字段 - 类似于:

alter table dbo.EmployeeMast
  add JoinYear AS YEAR(JoinDate) PERSISTED

alter table dbo.EmployeeMast
  add JoinMonth AS DATENAME(MONTH, JoinDate)

有了这个,您现在有两个额外的列 - JoinYear 作为数字,JoinMonth 作为字符串 - 这将始终反映某人加入的年份和月份 - 基于 JoinDate

它们是计算出来的——你不需要插入它们——它们会自动从JoinDate 计算出来,并且总是可供你使用。没有转换,没有混乱的插入 - 只需使用 JoinDate 插入您的行,您就可以立即获得年份和月份。

【讨论】:

  • 是的,我可以这样做,但我还需要用当前日期填写teacherattendencedet 表......我该怎么做?
  • @Sheetal Inani:同样的想法?基于日期的年份和月份?也只需在那里添加计算列!
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 2013-01-15
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
相关资源
最近更新 更多