Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并并转换nvarchar月字段+;将年份字段浮动到单个日期字段_Sql_Sql Server_String_Tsql_Datetime - Fatal编程技术网

Sql 合并并转换nvarchar月字段+;将年份字段浮动到单个日期字段

Sql 合并并转换nvarchar月字段+;将年份字段浮动到单个日期字段,sql,sql-server,string,tsql,datetime,Sql,Sql Server,String,Tsql,Datetime,我在SQL Server 2012中有一个表,其中一个月列存储为nvarchar(255): 表中的另一列,年份单独存储为float "2012","2013,"2014". 我没有“日”列,因此我希望创建一个合并的“月日期”列,日期从1开始 因此,月份和年份字段为2012年1月。我想展示“2012-01-01” 我如何才能这样做并将其添加到当前表中 我想在我的表中为每个员工查找记录的最大行数。 所以对于一个[雇员],[月],[年]。最新记录是

我在SQL Server 2012中有一个表,其中一个月列存储为
nvarchar(255)

表中的另一列,年份单独存储为float

"2012","2013,"2014".
我没有“日”列,因此我希望创建一个合并的“月日期”列,日期从1开始

因此,月份和年份字段为2012年1月。我想展示“2012-01-01”

我如何才能这样做并将其添加到当前表中

我想在我的表中为每个员工查找记录的最大行数。 所以对于一个[雇员],[月],[年]。最新记录是什么,例如:

1. 102, Jan, 2019
2. 102, feb, 2019

我只想看第二条最新的记录。

修复您的设计!存储数据的方式使得解释数据的效率非常低。在这里,我认为最简单的选项是
datefromparts()
和12个分支
case
表达式

假设(浮动)年存储在列
col\u year
中,(字符串)月存储在
col\u year
中:

select t.*,
    datefromparts(
        cast(col_year as int),
        case col_month
            when 'January'  then  1
            when 'February' then  2
            ...
            when 'December' then 12
        end,
        1
    ) as date_col
from mytable t

SQLServer具有相当灵活的转换功能。因此,只需将列转换为日期:

select convert(date, month + ' ' + year)
您可以通过以下方式获得最大值:

select empid, max(convert(date, month + ' ' + year))
from t
group by empid;
如果您真的喜欢,可以更改格式以用于输出目的。不过,我建议您坚持使用
日期


注意:这假设您的国际化设置设置为英语——如果您使用英语存储月份名称,这似乎是合理的。

您尝试了什么?你在哪里卡住了?让我们看看你的尝试。请每个问题只问一个问题。谢谢,我同意。数据是从excel上传的,并且是这种格式的,所以我想修改设计以正确存储数据
select empid, max(convert(date, month + ' ' + year))
from t
group by empid;