【问题标题】:Save datetime in sql table在sql表中保存日期时间
【发布时间】:2015-08-19 19:06:21
【问题描述】:

如何在查询中插入这样的日期? 2015-06-02T11:18:25.000

我试过这个:

INSERT INTO TABLE (FIELD) VALUES (convert(datetime,'2015-06-02T11:18:25.000'))

但我已经回来了:

Conversion failed when converting date and/or time from character string.

我也试过了:

CONVERT(DATETIME, '2015-06-02T11:18:25.000', 126)

但它不起作用:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

整个查询是:

INSERT INTO BOLLE_TEST_POPPER (QIDDIADE,QNUMBOLLA,QSELEZIONALE,QDATA,QORA,QPRIMAPESATA,QSECONDAPESATA,QIMP1,QIMP2,QIDCAUSALE,QIDCLIENTE,QIDDESTINAZIONE,QIDVETTORE,QIDSUBVETTORE,QIDCAMION,QORATRASITO,QNUMBOLLAINGRESSO,QDATABOLLAINGRESSO,QCOMMITTENTIDELTRASPORTO,QANNOTAZIONI,QANNOTAZIONIINBOLLA,QIDARTICOLO,QQANTITA,QIDAUTISTA,QNUMTESSERA,QNUMGETTONE,VALORETAB1,VALORETAB2,VALORETAB3,VALORETAB4,VALORETAB5,VALORETAB6,VALORETAB7,VALORETAB8,VALORETAB9,VALORETAB10,VALORETESTO1,VALORETESTO2,VALORETESTO3,VALORETESTO4,VALORETESTO5,VALORETESTO6,VALORETESTO7,VALORETESTO8,VALORETESTO9,VALORETESTO10) VALUES ('4','5234','-',
convert(datetime,'2015-06-02'),convert(datetime,'2015-06-02T11:18:25.000',126),'30020','20230','null','null','4','1','391','50','50','50','500',convert(datetime,'2015-06-02T11:14:06+02:00',126),'-','false','-','-','19','9790.00','1','BK994P','-','-','null','null','null','null','null','null','null','null','null','-','-','-','-','-','-','-','-','-','-');

怎么了?

【问题讨论】:

  • 表格列的数据类型是什么?什么版本的 SQL Server。不需要转换函数。
  • 您可能将注意力集中在 INSERT 中的错误列上。我会高度怀疑您尝试插入字符串 'null' 而不是非值 null 的那些列(注意,没有引号)。这些列的数据类型是什么? (当然,如果您发布了整个表定义会更容易)
  • 此外,作为一般数据建模技巧 - 如果您发现自己创建了除数字后缀之外的相同列,这通常表明应该将这些数据拆分到单独的表中并使用单独的行而不是存储值的列(这很有帮助,因为您有时需要查询所有此类数据,如果所有数据都在单个列中,这会更容易。此外,您不必将自己限制为 10 个值)跨度>

标签: sql sql-server datetime datetime-format sqldatetime


【解决方案1】:

试试这个。它对我有用。

  if(isset($_POST['buttonsave']))
    {
        $vfidperiodo      = preg_replace('#[^A-Za-z0-9]#i','',$_POST['idperiodo']);
        $vfperiodo        =  ms_escape_string($_POST['periodo']);
        $vffechainicio    =  $_POST['fecha_inicio'];



        $query_in="INSERT INTO iperiodos (idperiodo, periodo, fecha_inicio)
            VALUES ('".$vfidperiodo."','".$vfperiodo."','".$vffechainicio."')";


        $sql_in = sqlsrv_query($conn,$query_in);
       if ($sql_in) // Se eejectuto la sentencia SQL?
                  {
          echo "SQLSuccess"; // Mensaje Afirmativo.
                  } else {
         die( print_r( sqlsrv_errors(), true)); // Causa del error.       
                  }
         exit();
    }

这是数据库和表单图像。

【讨论】:

    【解决方案2】:

    试试这个:

    INSERT INTO TABLE (FIELD) VALUES CONVERT(DATETIME, '2015-06-02T11:18:25.000', 126)
    

    126 与 ISO8601 相关,格式为 yyyy-mm-ddThh:mi:ss.mmm

    这与字符串'2015-06-02T11:18:25.000' 的格式相同。

    有关详细信息,请参阅here

    对于带有 datetimeoffset 的日期(例如 '2015-06-02T11:14:06+02:00' - 请注意末尾的 +02:00),您必须这样做:

    CONVERT(DATETIME, CONVERT(DATETIMEOFFSET,'2015-06-02T11:14:06+02:00'), 127)
    

    完全固定的查询应该是:

    INSERT INTO BOLLE_TEST_POPPER (QIDDIADE,QNUMBOLLA,QSELEZIONALE,QDATA,QORA,QPRIMAPESATA,QSECONDAPESATA,QIMP1,QIMP2,QIDCAUSALE,QIDCLIENTE,QIDDESTINAZIONE,QIDVETTORE,QIDSUBVETTORE,QIDCAMION,QORATRASITO,QNUMBOLLAINGRESSO,QDATABOLLAINGRESSO,QCOMMITTENTIDELTRASPORTO,QANNOTAZIONI,QANNOTAZIONIINBOLLA,QIDARTICOLO,QQANTITA,QIDAUTISTA,QNUMTESSERA,QNUMGETTONE,VALORETAB1,VALORETAB2,VALORETAB3,VALORETAB4,VALORETAB5,VALORETAB6,VALORETAB7,VALORETAB8,VALORETAB9,VALORETAB10,VALORETESTO1,VALORETESTO2,VALORETESTO3,VALORETESTO4,VALORETESTO5,VALORETESTO6,VALORETESTO7,VALORETESTO8,VALORETESTO9,VALORETESTO10) VALUES ('4','5234','-',
    convert(datetime,'2015-06-02'),convert(datetime,'2015-06-02T11:18:25.000',126),'30020','20230','null','null','4','1','391','50','50','50','500',CONVERT(DATETIME, CONVERT(DATETIMEOFFSET,'2015-06-02T11:14:06+02:00'), 127),'-','false','-','-','19','9790.00','1','BK994P','-','-','null','null','null','null','null','null','null','null','null','-','-','-','-','-','-','-','-','-','-');
    

    【讨论】:

    • 那个有效,我认为您在查询中遇到了另一个日期的问题。如果我运行查询 SELECT CONVERT(DATETIME, '2015-06-02T11:18:25.000', 126) - 它会返回一个日期。
    • 这个不行:select convert(datetime,'2015-06-02T11:14:06+02:00',126)
    • 你必须像这样转换它:CONVERT(DATETIME, CONVERT(DATETIMEOFFSET,'2015-06-02T11:14:06+02:00'), 127)
    • Donal 的最后一条评论几乎有效,但您必须删除“127”。只是:转换(日期时间,转换(日期时间偏移,'2015-06-02T11:14:06+02:00'))。或者,您可以跳过所有转换,只需插入 LEFT('2015-06-02T11:14:06+02:00', 19)
    • 我注意到不同版本的 Sql Server 有不同的行为。它似乎适用于 Sql Server 2008 R2 中的 127,但不适用于 Sql Server 2014。
    【解决方案3】:

    你需要一个格式。在这种情况下,126:

    INSERT INTO TABLE (FIELD)
        VALUES (convert(datetime,'2015-06-02T11:18:25.000', 126))
    

    列表是here

    对于时区,您需要 127,因此您需要修复您的 values 子句:

    ('4','5234','-',
        convert(datetime,'2015-06-02'),convert(datetime,'2015-06-02T11:18:25.000',127),'30020','20230','null','null','4','1','391','50','50','50','500',convert(datetime,'2015-06-02T11:14:06+02:00',127),'-','false','-','-','19','9790.00','1','BK994P','-','-','null','null','null','null','null','null','null','null','null','-','-','-','-','-','-','-','-','-','-');
    

    【讨论】:

    • 对于时区,您需要 127,而不是 126。
    • 这样会导致转换失败:select convert(datetime,'2015-06-02T11:14:06+02:00',127),试试看。
    • @Donal 。 . .多么有趣。 documentation 中给出的示例也失败了 (sqlfiddle.com/#!6/9eecb7/80)。
    • @GordonLinoff 我对文档中的 Z 位感到困惑 - 时区 Z。不知道去那里的意思是什么,文档对此有点轻描淡写。如果将字符串转换为 datetimeoffset,则可以将其转换为 datetime。
    • 看来需要先转换成datetime2,再转换成datetimesqlfiddle.com/#!6/9eecb7/89
    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2018-01-14
    • 2017-08-25
    • 2023-04-08
    相关资源
    最近更新 更多