MethodCallExpressionResolve_BaseDateFomat.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Threading.Tasks;
  7. namespace SqlSugar
  8. {
  9. /// <summary>
  10. /// MethodCall base DateFomat
  11. /// </summary>
  12. public partial class MethodCallExpressionResolve : BaseResolve
  13. {
  14. public string GeDateFormat(string formatString, string value)
  15. {
  16. if (IsOracle() && formatString == "yyyy-MM-dd HH:mm:ss")
  17. {
  18. return $"to_char({value},'yyyy-MM-dd HH24:mi:ss') ";
  19. }
  20. else if (IsOracle() || IsPg())
  21. {
  22. if (!(formatString?.Contains("24") == true))
  23. {
  24. formatString = formatString.Replace("HH", "hh24");
  25. if (!(formatString?.Contains("24") == true))
  26. {
  27. formatString = formatString.Replace("hh", "hh24");
  28. }
  29. }
  30. formatString = formatString.Replace("mm", "mi");
  31. //if (formatString.HasValue() && formatString.Contains("hh:mm"))
  32. //{
  33. // formatString = formatString.Replace("hh:mm", "hh:mi");
  34. //}
  35. //else if (formatString.HasValue() && formatString.Contains("hhmm"))
  36. //{
  37. // formatString = formatString.Replace("hhmm", "hhmi");
  38. //}
  39. //else if (formatString.HasValue() && formatString.Contains("HH:mm"))
  40. //{
  41. // formatString = formatString.Replace("HH:mm", "HH:mi");
  42. //}
  43. //else if (formatString.HasValue() && formatString.Contains("HHmm"))
  44. //{
  45. // formatString = formatString.Replace("HHmm", "HHmi");
  46. //}
  47. return $"to_char({value},'{formatString}') ";
  48. }
  49. else if (IsSqlite() && formatString == "yyyy-MM-dd")
  50. {
  51. return $"strftime('%Y-%m-%d', {value})";
  52. }
  53. else if (IsSqlite() && formatString == "yyyy-MM-dd HH:mm:ss")
  54. {
  55. return $"strftime('%Y-%m-%d %H:%M:%S', {value})";
  56. }
  57. else if (IsSqlite() && formatString == "yyyy-MM-dd hh:mm:ss")
  58. {
  59. return $"strftime('%Y-%m-%d %H:%M:%S', {value})";
  60. }
  61. else if (IsSqlite() && formatString == "yyyy-MM")
  62. {
  63. return $"strftime('%Y-%m', {value})";
  64. }
  65. else if (IsSqlite() && formatString == "yyyyMM")
  66. {
  67. return $"strftime('%Y%m', {value})";
  68. }
  69. else if (IsSqlite() && formatString == "yyyyMMdd")
  70. {
  71. return $"strftime('%Y%m%d', {value})";
  72. }
  73. else if (IsSqlite() && formatString.Contains("%"))
  74. {
  75. return $"strftime('{formatString}', {value})";
  76. }
  77. else if (IsMySql() && formatString == "yyyy-MM-dd")
  78. {
  79. return $"DATE_FORMAT({value}, '%Y-%m-%d')";
  80. }
  81. else if (IsMySql() && formatString == "yyyy-MM")
  82. {
  83. return $"DATE_FORMAT({value}, '%Y-%m')";
  84. }
  85. else if (IsMySql() && formatString == "yyyyMM")
  86. {
  87. return $"DATE_FORMAT({value}, '%Y%m')";
  88. }
  89. else if (IsMySql() && formatString == "yyyyMMdd")
  90. {
  91. return $"DATE_FORMAT({value}, '%Y%m%d')";
  92. }
  93. else if (IsMySql() && formatString == "yyyy-MM-dd HH:mm:ss")
  94. {
  95. return $"DATE_FORMAT({value}, '%Y-%m-%d %H:%i:%S')";
  96. }
  97. else if (IsMySql() && formatString == "yyyy-MM-dd hh:mm:ss")
  98. {
  99. return $"DATE_FORMAT({value}, '%Y-%m-%d %H:%i:%S')";
  100. }
  101. else if (IsMySql() && formatString.Contains("%"))
  102. {
  103. return $"DATE_FORMAT({value}, '{formatString}')";
  104. }
  105. else if (formatString == "yyyy-MM-dd" && IsSqlServer())
  106. {
  107. return $"CONVERT(varchar(100),convert(datetime,{value}), 23)";
  108. }
  109. else if (formatString == "yyyy-MM" && IsSqlServer())
  110. {
  111. return $"CONVERT(varchar(7),convert(datetime,{value}), 23)";
  112. }
  113. else if (formatString == "yyyy-MM-dd HH:mm:ss" && IsSqlServer())
  114. {
  115. return $"CONVERT(varchar(100),convert(datetime,{value}), 120)";
  116. }
  117. else if (formatString == "yyyy-MM-dd hh:mm:ss" && IsSqlServer())
  118. {
  119. return $"CONVERT(varchar(100),convert(datetime,{value}), 120)";
  120. }
  121. else if (formatString == "yyyy-MM-dd HH:mm" && IsSqlServer())
  122. {
  123. return $"CONVERT(varchar(16),convert(datetime,{value}), 120)";
  124. }
  125. else if (formatString == "yyyy-MM-dd hh:mm" && IsSqlServer())
  126. {
  127. return $"CONVERT(varchar(16),convert(datetime,{value}), 120)";
  128. }
  129. else if (formatString == "yyyy-MM-dd hh:mm:ss.ms" && IsSqlServer())
  130. {
  131. return $"CONVERT(varchar(100),convert(datetime,{value}), 121)";
  132. }
  133. else if (IsSqlServer() && formatString != null && formatString.IsInt())
  134. {
  135. return string.Format("CONVERT(varchar(100),convert(datetime,{0}), {1})", value, formatString);
  136. }
  137. else if (IsSqlServer())
  138. {
  139. return string.Format("FORMAT({0},'{1}','en-US')", value, formatString);
  140. }
  141. else if (IsMySql()&& !formatString.Contains("%"))
  142. {
  143. var newFormt = formatString
  144. .Replace("yyyy", "%Y")
  145. .Replace("yy", "%Y")
  146. .Replace("MM", "%m")
  147. .Replace("M", "%m")
  148. .Replace("dd", "%d")
  149. .Replace("HH", "%H")
  150. .Replace("hh", "%h")
  151. .Replace("mm", "%i")
  152. .Replace("ss", "%s")
  153. .Replace("fff", "%f");
  154. return $"DATE_FORMAT({value}, '{newFormt}')";
  155. }
  156. else if (IsSqlite() && !formatString.Contains("%"))
  157. {
  158. var newFormt = formatString
  159. .Replace("yyyy", "%Y")
  160. .Replace("yy", "%Y")
  161. .Replace("MM", "%m")
  162. .Replace("M", "%m")
  163. .Replace("dd", "%d")
  164. .Replace("HH", "%H")
  165. .Replace("hh", "%h")
  166. .Replace("mm", "%M")
  167. .Replace("ss", "%S")
  168. .Replace("fff", "%f");
  169. return $"strftime('{newFormt}',{value})";
  170. }
  171. var parameter = new MethodCallExpressionArgs() { IsMember = true, MemberValue = DateType.Year };
  172. var parameter2 = new MethodCallExpressionArgs() { IsMember = true, MemberName = value };
  173. var parameters = new MethodCallExpressionModel() { Args = new List<MethodCallExpressionArgs>() { parameter2, parameter } };
  174. var begin = @"^";
  175. var end = @"$";
  176. formatString = formatString.Replace("yyyy", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  177. formatString = formatString.Replace("yy", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  178. parameters.Args.Last().MemberValue = DateType.Month;
  179. if (IsMySql())
  180. {
  181. formatString = formatString.Replace("MM", begin + UtilMethods.ConvertStringToNumbers("LPAD(" + this.GetMethodValue("DateValue", parameters).ObjToString() + ",2,0)") + end);
  182. }
  183. else if (IsSqlite())
  184. {
  185. formatString = formatString.Replace("MM", begin + UtilMethods.ConvertStringToNumbers("SUBSTR('00' ||" + this.GetMethodValue("DateValue", parameters).ObjToString() + ", -2, 2)") + end);
  186. }
  187. else if (IsPg())
  188. {
  189. formatString = formatString.Replace("MM", begin + UtilMethods.ConvertStringToNumbers("lpad(cast(" + this.GetMethodValue("DateValue", parameters).ObjToString() + " as varchar(20)),2,'0')") + end);
  190. }
  191. else if (IsOracle())
  192. {
  193. formatString = formatString.Replace("MM", begin + UtilMethods.ConvertStringToNumbers("lpad(cast(" + this.GetMethodValue("DateValue", parameters).ObjToString() + " as varchar(20)),2,'0')") + end);
  194. }
  195. else
  196. {
  197. formatString = formatString.Replace("MM", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  198. }
  199. formatString = formatString.Replace("M", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  200. parameters.Args.Last().MemberValue = DateType.Day;
  201. if (IsSqlServer())
  202. {
  203. formatString = formatString.Replace("dd", begin + UtilMethods.ConvertStringToNumbers(string.Format("CASE WHEN LEN({0})=1 THEN '0'+ {0} else {0} end", this.GetMethodValue("DateValue", parameters))) + end);
  204. }
  205. formatString = formatString.Replace("dd", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  206. formatString = formatString.Replace("d", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  207. parameters.Args.Last().MemberValue = DateType.Hour;
  208. formatString = Regex.Replace(formatString, "hh", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end, RegexOptions.IgnoreCase);
  209. formatString = Regex.Replace(formatString, "h", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end, RegexOptions.IgnoreCase);
  210. parameters.Args.Last().MemberValue = DateType.Minute;
  211. formatString = formatString.Replace("mm", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  212. formatString = formatString.Replace("m", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  213. parameters.Args.Last().MemberValue = DateType.Second;
  214. formatString = formatString.Replace("ss", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  215. formatString = formatString.Replace("s", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  216. if (!IsSqlite())
  217. {
  218. parameters.Args.Last().MemberValue = DateType.Millisecond;
  219. formatString = formatString.Replace("ms", begin + UtilMethods.ConvertStringToNumbers(this.GetMethodValue("DateValue", parameters).ObjToString()) + end);
  220. }
  221. var items = Regex.Matches(formatString, @"\^\d+\$").Cast<Match>().ToList();
  222. foreach (var item in items)
  223. {
  224. formatString = formatString.Replace(item.Value, "$@" + UtilMethods.ConvertNumbersToString(item.Value.TrimStart('^').TrimEnd('$')) + "$");
  225. }
  226. var strings = formatString.TrimStart('$').TrimEnd('$').Split('$');
  227. var joinStringParameter = new MethodCallExpressionModel()
  228. {
  229. Args = new List<MethodCallExpressionArgs>()
  230. };
  231. foreach (var r in strings)
  232. {
  233. if (r != "" && r.Substring(0, 1) == "@")
  234. {
  235. joinStringParameter.Args.Add(new MethodCallExpressionArgs()
  236. {
  237. MemberName = r.TrimStart('@')
  238. });
  239. }
  240. else
  241. {
  242. var name = base.AppendParameter(r);
  243. joinStringParameter.Args.Add(new MethodCallExpressionArgs()
  244. {
  245. MemberName = name
  246. });
  247. }
  248. }
  249. return this.GetMethodValue("MergeString", joinStringParameter).ObjToString();
  250. }
  251. private bool IsSqlServer()
  252. {
  253. return this.Context is SqlServerExpressionContext;
  254. }
  255. private bool IsMySql()
  256. {
  257. var name = this.Context.GetType().Name;
  258. var result = (name == "MySqlExpressionContext");
  259. return result;
  260. }
  261. private bool IsSqlite()
  262. {
  263. return this.Context is SqliteExpressionContext;
  264. }
  265. private bool IsPg()
  266. {
  267. return this.Context is PostgreSQLExpressionContext
  268. ||this.Context is KdbndpExpressionContext;
  269. }
  270. private bool IsOracle()
  271. {
  272. return this.Context is OracleExpressionContext;
  273. }
  274. }
  275. }