如何在SqlServer中将给定文本转换为所需的日期格式

时间:2017-03-27 13:01:31

标签: c# sql-server date

我有一个带有table with dateEntered(varchar datatype) column 的旧数据库,可以采用各种格式的日期,例如
A> ' wk231216'这意味着(周)23-(日期)12-(年)2016
B个' 231216'这意味着(周)23-(日期)12-(年)2016
c取代; ' wk132717'这意味着(周)13-(日期)27-(年)2017

 现在我需要将上述日期修改为' YYYY-MM-DD'

A>应该成为2016 - 06 - 12(2016年第23号是6月(06))
B个应该成为2016-06-12
c取代;应该成为2017-03-27

有谁能建议如何实现这一目标? 谢谢!!

2 个答案:

答案 0 :(得分:0)

成为SQL新手我确信有很多更好的方法可以做到这一点,但你可以创建以下功能:

CREATE FUNCTION ConvertFromWeekDateToMyDate(@input VARCHAR(10))
RETURNS DateTime
AS BEGIN
declare 
    @Year char(4), 
    @Week TINYINT, 
    @Day TINYINT, 
    @month TINYINT,
    @hasWk bit

set @hasWk = case when LEFT(@input, 2) = 'wk' then 1 else 0 end
set @Week = case when @hasWk = 1 then substring(@input, 3, 2) else substring(@input, 1, 2) end
set @Day = case when @hasWk = 1 then substring(@input, 5, 2) else substring(@input, 3, 2) end
set @Year = '20' + RIGHT(@input, 2)
set @month = DATEPART(MM,CAST(CONVERT(CHAR(3),
                 DATEADD(WW,@WEEK - 1,
                 CONVERT(datetime,'01/01/'+ CONVERT(char(4),@Year))),100) + ' 1900' AS DATETIME))

RETURN DATEFROMPARTS (@Year, @month, @Day) 
END

调用类似于

update YourTable set DateColumn = ConvertFromWeekDateToMyDate(DateColumn)

您可以根据需要调整变量类型,名称,函数名称等,但它应该让您入门。

以上是使用此SO帖子►Get Month from Calendar Week (SQL Server)

中的每周转换代码

使用以下输入测试上述功能:

SELECT dbo.ConvertFromWeekDateToMyDate('wk231216') as 'wk231216',
dbo.ConvertFromWeekDateToMyDate('231216') as '231216',
dbo.ConvertFromWeekDateToMyDate('wk132717') as 'wk132717'

给我这个结果(似乎符合你的预期结果):

wk231216                231216                  wk132717
----------------------- ----------------------- -----------------------
2016-06-12 00:00:00.000 2016-06-12 00:00:00.000 2017-03-27 00:00:00.000

答案 1 :(得分:0)

不要使用UDF,它不会缩放,不使用光标,也不会缩放。

作为十人的首发(或者你的例子中有错误,或者我不遵循逻辑100%)你可以尝试这样的事情:

DECLARE @table TABLE (naff_date VARCHAR(50));
INSERT INTO @table SELECT 'wk231216';
INSERT INTO @table SELECT '231216';
INSERT INTO @table SELECT 'wk132717';
--Preformat
WITH x AS (SELECT CASE WHEN naff_date LIKE 'wk%' THEN SUBSTRING(naff_date, 3, 50) ELSE naff_date END AS naff_date FROM @table WHERE LEN(naff_date) IN (6, 8))
SELECT 
    '20' + RIGHT(naff_date, 2) + '-' + RIGHT('0' + CONVERT(VARCHAR(2), MONTH(CONVERT(INT, DATEADD(WEEK, CONVERT(INT, SUBSTRING(naff_date, 1, 2)), '20170101')))), 2) + '-' + SUBSTRING(naff_date, 3, 2) AS new_date
FROM 
    x
WHERE
    ISNUMERIC(naff_date) = 1;

有很多" iffs和buts"在那里,我尽力删除任何会导致错误的日期。我建议尝试这个,但显然调整查询以使用你的真实表,然后将结果写在其他地方进行健全性检查,记录错误等等。

我得到以下结果:

new_date
2016-06-12
2016-06-12
2017-04-27

前两个例子也一样,但另一个例子一个月(但我觉得我的结果在这里是正确的吗?)。

我想如果你的一周是"零基础"那么这会更好,它也不是假设每年都没有闰年(正如我原来的回答所做的那样):

DECLARE @table TABLE (naff_date VARCHAR(50));
INSERT INTO @table SELECT 'wk231216';
INSERT INTO @table SELECT '231216';
INSERT INTO @table SELECT 'wk132717';
--Preformat
WITH x AS (SELECT CASE WHEN naff_date LIKE 'wk%' THEN SUBSTRING(naff_date, 3, 50) ELSE naff_date END AS naff_date FROM @table WHERE LEN(naff_date) IN (6, 8)),
--Get the year, week and day
y AS (
    SELECT
        '20' + RIGHT(naff_date, 2) AS [year],
        SUBSTRING(naff_date, 1, 2) AS [week],
        SUBSTRING(naff_date, 3, 2) AS [day]
    FROM 
        x
    WHERE
        ISNUMERIC(naff_date) = 1)
--Now we have enough information for the whole date
SELECT
    [year] + '-' + RIGHT('0' + CONVERT(VARCHAR(2), MONTH(DATEADD(WEEK, CONVERT(INT, [week]) - 1, CONVERT(DATE, [year] + '0101')))), 2) + '-' + [day] AS new_date
FROM
    y;