此表中有4个CTE,第三个包含DATETIME,其转换为VARCHAR(根据要求具有格式),格式为startDate
,格式为DD/MM/YYYY
。最后一个cte根据生成的数据进行计算,并且其中一列需要根据YYYYMM
存储startDate
日期。
问题是从转换后的DATETIME获取年份和月份,使用convert()会显示以下内容:
IDPER
-------
01/01/ --DD/MM/
当未转换startDate时,这2个正确显示YYYYMM
:
Select *, left(convert(nvarchar(6),new_ini,112),6) as IDPER from table
Select *, convert(nvarchar(6),new_ini,112) as IDPER from table
如何将YYYYMM
转换为startDate
格式?或者是一种更明智的需求解决方法
答案 0 :(得分:1)
如果您有DD / MM / YYYY格式的字符串,并且想要YYYYMM,请使用字符串操作:
select right(new_ini, 4) + substring(new_ini, 4, 2)
您应该将日期值存储为date
或相关类型,而不是字符串。但是考虑到您已经将其存储为字符串,字符串操作可以满足您的需要。
答案 1 :(得分:0)
声明$ cat enum.c
/*! Object types */
#define F_ENUM(x, y) x = y,
#define F_SWITCH(x, y) case x: return ( #x );
#define OB_LIST(f) \
f(T0, 0) \
f(T1, 1) \
f(T2, 2) \
f(T3, 3) \
f(T4, 4) \
f(T5, 5)
enum mxt_object_type {
OB_LIST(F_ENUM)
};
const char * enum2str(enum mxt_object_type type)
{
switch(type) {
OB_LIST(F_SWITCH)
}
return "invalid";
}
$ gcc -E enum.c
# 1 "enum.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "enum.c"
# 13 "enum.c"
enum mxt_object_type {
T0 = 0, T1 = 1, T2 = 2, T3 = 3, T4 = 4, T5 = 5,
};
const char * enum2str(enum mxt_object_type type)
{
switch(type) {
case T0: return ( "T0" ); case T1: return ( "T1" ); case T2: return ( "T2" ); case T3: return ( "T3" ); case T4: return ( "T4" ); case T5: return ( "T5" );
}
return "invalid";
}
答案 2 :(得分:0)
我的方式会有所不同
SELECT CONVERT(NVARCHAR(6), CONVERT(DATE, new_ini, 103), 112);
在这里,我先将其转换为日期,然后将其格式化为YYYYMMDD,并且仅使用6个字符