将varchar变量转换/获取为YYYYMM

时间:2019-02-05 14:35:04

标签: sql sql-server sql-server-2008 type-conversion

此表中有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格式?或者是一种更明智的需求解决方法

3 个答案:

答案 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个字符