【问题标题】:Storing day of week with time in database在数据库中存储星期几和时间
【发布时间】:2013-05-09 01:11:56
【问题描述】:

只在数据库中存储星期几和时间保存0000-00-00 00:00:00, 预期数据应该像Monday 8:30 AM

存储过程

    CREATE DEFINER=`admin`@`192.168.21.%` PROCEDURE `AddDay`(d DATETIME)
BEGIN
    INSERT INTO `tbl_days`(`day`) VALUES(d);
END

C#代码:

StringBuilder sb = new StringBuilder();
            sb.Append(cmbDay.Text.Trim()).Append(" ");
            sb.Append(cmbHour.Text.Trim()).Append(":");
            sb.Append(cmbMinutes.Text.Trim()).Append(" ");
            sb.Append(cmbTime.Text.Trim());

            string day = sb.ToString();

如果我将数据类型从DATETIME 更改为VARCHAR,问题将得到解决,如何解决此问题?还是我应该只使用VARCHAR

【问题讨论】:

  • 您应该遵循最佳实践并存储为日期时间...
  • 永远不要将逻辑日期/时间/等存储为 varchar。 不要这样做。
  • @Patashu,我明白了,我该如何解决这个问题?
  • @SHINHAN 带有调试器。如果0000-00-00 00:00:00 被保存到数据库中,听起来你正在尝试插入一个有效的日期,mysql 会将其转换为全 0。你的数据正确吗?在使用字符串生成器构建它们之后发送到 SQL 查询的日期是否正确?等

标签: c# mysql datetime stored-procedures


【解决方案1】:

无需将此值存储在数据库中。请记住,您始终可以在 SQL 中检索星期几,例如:

  • 使用DAYNAME 命令:

    SELECT DAYNAME(day) FROM tbl_days

  • 使用DAYFORMAT 命令:

    SELECT DATE_FORMAT(day, '%W');

Date and Time Functions 的 MySQL 参考手册中的更多信息

[编辑]:您可以将day 列类型声明为TIMESTAMP,然后您的INSERT 查询可能类似于

INSERT INTO tbl_days (day) VALUES (NOW());

或有明确的输入,例如:

SET @date = CONCAT($year,'-',$month,'-',$day,'-',$hour,'-',$minute,'-',$second);
INSERT INTO tbl_days (day) VALUES (STR_TO_DATE(@date,'%Y-%c-%e-%k-%i-%s'));

【讨论】:

  • 不,用户需要在数据库示例中保存日期时间:星期一 8:00 AM
  • 我同意 GregD 的观点:您应该以常规 DateTime 格式存储值并使用 SELECT 语句提取有关日期名称的信息。
  • @SHINHAN:如果这是要求(虽然看起来有点奇怪),那么您可以创建一个触发器来提取日期名称(如 GregD 建议的那样)并将其存储在数据的附加字段中入口事件(或用于触发过程的任何事件)
  • @SHINHAN 用户需要在数据库中以这种格式保存还是在应用程序中以这种格式显示?
  • @SHINHAN - 是的,但从长远来看,将值存储为TIMESTAMP 值而不是VARCHAR 会更好。将来你永远不知道你还想用这些值做什么,TIMESTAMP 给你更多的灵活性。
猜你喜欢
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2021-09-27
  • 2016-09-09
相关资源
最近更新 更多