我有一个带有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
有谁能建议如何实现这一目标? 谢谢!!
答案 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;