verify-timestamp-format.ts 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/env tsx
  2. /**
  3. * 验证 works 和 work_day_statistics 表的时间字段格式
  4. */
  5. import { initDatabase } from '../models/index.js';
  6. import { AppDataSource } from '../models/index.js';
  7. import { logger } from '../utils/logger.js';
  8. async function verifyTimestampFormat() {
  9. try {
  10. await initDatabase();
  11. logger.info('数据库连接已初始化');
  12. logger.info('\n========================================');
  13. logger.info('验证时间字段格式...');
  14. logger.info('========================================\n');
  15. // 检查 works 表
  16. logger.info('works 表示例数据:');
  17. const works = await AppDataSource.query(`
  18. SELECT id,
  19. created_at,
  20. updated_at,
  21. DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') as created_at_formatted,
  22. DATE_FORMAT(updated_at, '%Y-%m-%d %H:%i:%s') as updated_at_formatted
  23. FROM works
  24. ORDER BY id DESC
  25. LIMIT 5
  26. `);
  27. works.forEach((row: any) => {
  28. logger.info(` ID ${row.id}:`);
  29. logger.info(` created_at (原始): ${row.created_at}`);
  30. logger.info(` created_at (格式化): ${row.created_at_formatted}`);
  31. logger.info(` updated_at (原始): ${row.updated_at}`);
  32. logger.info(` updated_at (格式化): ${row.updated_at_formatted}`);
  33. });
  34. // 检查 work_day_statistics 表
  35. logger.info('\nwork_day_statistics 表示例数据:');
  36. const stats = await AppDataSource.query(`
  37. SELECT id,
  38. created_at,
  39. updated_at,
  40. DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') as created_at_formatted,
  41. DATE_FORMAT(updated_at, '%Y-%m-%d %H:%i:%s') as updated_at_formatted
  42. FROM work_day_statistics
  43. ORDER BY id DESC
  44. LIMIT 5
  45. `);
  46. stats.forEach((row: any) => {
  47. logger.info(` ID ${row.id}:`);
  48. logger.info(` created_at (原始): ${row.created_at}`);
  49. logger.info(` created_at (格式化): ${row.created_at_formatted}`);
  50. logger.info(` updated_at (原始): ${row.updated_at}`);
  51. logger.info(` updated_at (格式化): ${row.updated_at_formatted}`);
  52. });
  53. // 检查表结构
  54. logger.info('\n检查表结构:');
  55. const worksStructure = await AppDataSource.query(`
  56. SHOW COLUMNS FROM works WHERE Field IN ('created_at', 'updated_at')
  57. `);
  58. logger.info('works 表字段类型:');
  59. worksStructure.forEach((col: any) => {
  60. logger.info(` ${col.Field}: ${col.Type}`);
  61. });
  62. const statsStructure = await AppDataSource.query(`
  63. SHOW COLUMNS FROM work_day_statistics WHERE Field IN ('created_at', 'updated_at')
  64. `);
  65. logger.info('work_day_statistics 表字段类型:');
  66. statsStructure.forEach((col: any) => {
  67. logger.info(` ${col.Field}: ${col.Type}`);
  68. });
  69. logger.info('\n========================================');
  70. logger.info('验证完成!');
  71. logger.info('========================================\n');
  72. } catch (error: any) {
  73. logger.error('验证失败:', error);
  74. if (error instanceof Error) {
  75. logger.error('错误堆栈:', error.stack);
  76. }
  77. process.exit(1);
  78. } finally {
  79. await AppDataSource.destroy();
  80. process.exit(0);
  81. }
  82. }
  83. verifyTimestampFormat().catch(console.error);