我正在尝试将其转换为周期格式,例如2018_05(YYYY_MM)。当前数据为DD / MM / YYYY格式。
我尝试了强制转换代码,但返回了YYYY_DD。
SELECT
CASE WHEN RESERVED_FIELD_4 IS NULL THEN NULL
ELSE cast(year(RESERVED_FIELD_4) as Nvarchar (4))
+'_'+right('00'+cast(month(RESERVED_FIELD_4) as Nvarchar (2)),2)
END AS [DATAFEED_PERIOD]
我希望/希望看到YYYY_MM。
答案 0 :(得分:1)
假设RESERVED_FIELD_4
是字符串类型(char
/ nchar
/ varchar
/ nvarchar
),最简单的解决方案是使用substring
:
CASE
WHEN RESERVED_FIELD_4 IS NULL THEN NULL
ELSE SUBSTRING(RESERVED_FIELD_4, 7, 4) + '_'+ SUBSTRING(RESERVED_FIELD_4, 4, 2)
END AS [DATAFEED_PERIOD]
如果它是date
/ datetime
/ datetime2
数据类型,则最简单的解决方案是使用format
:
FORMAT(RESERVED_FIELD_4, 'yyyy_MM')
但是要获得更好的性能,可以使用convert
和stuff
:
SELECT STUFF(CONVERT(char(6), RESERVED_FIELD_4, 112), 5, 0, '_')
如果您的格式实际上是d/m/y
,最简单的选择是将其转换为日期,而不是转换为字符串:
SELECT STUFF(CONVERT(char(6), CONVERT(Date, RESERVED_FIELD_4, 103), 112), 5, 0, '_')
答案 1 :(得分:1)
这是使用VARCHAR
列存储日期的常见问题。您正在猜测存储的模式是DD/MM/YYYY
,但是SQL引擎不知道该存储模式,目前正在采用MM/DD/YYYY
模式。
请检查以下结果:
-- MM/DD/YYYY
SELECT
DAY ('05/01/2019'), -- 1
MONTH('05/01/2019') -- 5
-- DD/MM/YYYY
SELECT
DAY ('25/05/2019'), -- Conversion failed when converting date and/or time from character string
MONTH('25/05/2019') -- Conversion failed when converting date and/or time from character string.
要正确显示所需内容,请使用字符串函数:
SELECT
RIGHT(RESERVED_FIELD_4, 4) + '_' + SUBSTRING(RESERVED_FIELD_4, 4, 2)
但是您实际上应该在VARCHAR
列上固定值,将其强制转换为DATE
并将这些值存储为DATE
。
ALTER TABLE YourTable ADD ReservedField4Date DATE
UPDATE YourTable SET
ReservedField4Date = CONVERT(DATE,
RIGHT(RESERVED_FIELD_4, 4) -- Year
+ '-' + SUBSTRING(RESERVED_FIELD_4, 4, 2) -- Month
+ '-' + LEFT(RESERVED_FIELD_4, 2)) -- Day
ALTER TABLE YourTable DROP COLUMN RESERVED_FIELD_4
EXEC sp_rename 'SchemaName.YourTable.ReservedField4Date', 'RESERVED_FIELD_4', 'COLUMN'
请注意,更改列类型可能会影响其他假设这是VARCHAR
列的查询。
答案 2 :(得分:0)
为什么不只是对话? :
SELECT REPLACE(CONVERT(VARCHAR(7), CONVERT(date, RESERVED_FIELD_4, 101), 102), '.', '_')
这假设RESERVED_FIELD_4
是date
类型。
答案 3 :(得分:0)
在SQL-SERVER中,您可以使用“格式”
format(dy,@your_date) as day_of_year
month(@your_date) as month
尝试一下:
Select concat(month(@your_date),'_'year(@your_date)) as your_period
this是参考
答案 4 :(得分:0)
如果您的数据采用DD / MM / YYYY格式,则将其存储为字符串。因此,想到了字符串函数:
select right(RESERVED_FIELD_4) + '_' + substrint(RESERVED_FIELD_4, 4, 2)