【问题标题】:SQL: how to specify a date format on creating a table and fill itSQL:如何在创建表时指定日期格式并填写
【发布时间】:2017-11-08 11:37:48
【问题描述】:

我想以“dd.mm.yyyy”格式保存日期。所以我读到 SQL 中有不同的日期格式(顺便说一下我使用 Visual Studio 和 SQL Server)。

我试过这段代码:

CREATE TABLE APP(
    ID   INT NOT NULL,
    DT DATE FORMAT 'dd.mm.yyyy',
    ADDRESS  NVARCHAR (100) ,
    PRIMARY KEY (ID)
);

但它返回错误:

“FORMAT”附近的语法不正确。

之后我想使用这段代码:

INSERT INTO APP (ID, DT)
VALUES ('1','22.12.2016')

【问题讨论】:

  • DateTime 是像整数一样的值类型。你不能给它任何格式。阅读时需要格式化。
  • 只需使用日期类型存储您的日期,然后使用CONVERT 之类的东西担心视觉格式。 不要将日期存储为文本。
  • 只是一个想法,但是您给出的示例 '12.22.2016' 的格式不是错误的表定义给出的格式 'dd.mm.yyyy'(只有 12 个月而不是 22 个月) .您实际上想在插入语句美国格式或德语格式中提供什么?
  • @MartinBrown 你是对的!谢谢!它是德语格式,只是错过了点击。

标签: sql sql-server date


【解决方案1】:

您无需在表定义中指定格式,因为日期以二进制格式存储。

CREATE TABLE APP(
    ID   INT NOT NULL,
    DT DATE,
    ADDRESS  NVARCHAR (100) ,
    PRIMARY KEY (ID)
);

但是,当您尝试插入该表时,服务器将尝试在插入之前将字符串转换为日期。这可能会有问题,因为它无法判断 12.11.2017 是 11 月 12 日还是 12 月 11 日。为了解决这个问题,它使用正在执行操作的用户帐户的本地化设置。

通常您会发现运行该操作的帐户设置为美国格式,月日然后年(MDY),而您想要的是日月年(DMY)格式。告诉它日期部分的顺序的一种方法是使用DATEFORMAT 设置,如下所示:

SET DATEFORMAT dmy;

INSERT INTO APP (ID, DT)
VALUES (1,'22.12.2016')

另一种选择是使用CONVERT 函数将字符串转换为日期,并告诉它日期格式是什么。格式有 numeric codes 像德语格式的 104 像这样:

INSERT INTO APP (ID, DT)
VALUES (2,CONVERT(date,'22.12.2016',104))

【讨论】:

    【解决方案2】:

    日期以内部格式存储。格式只对输入和输出有意义。

    在您的情况下,您需要德语格式 (104) 的日期,因此您可以使用:

    select convert(varchar(255), dt, 104)
    

    如果您愿意,可以将格式化的日期作为单独的列包含:

    CREATE TABLE APP (
        ID INT NOT NULL,
        DT DATE,
        ADDRESS  NVARCHAR(100),
        DT_FORMATTED AS (convert(varchar(255), dt, 104)),
        PRIMARY KEY (ID)
    );
    

    然后您可以参考dt_formatted 以获取所需格式的字符串。

    【讨论】:

    • 感谢您这么快的答复!您能否补充一点:如何将日期添加为 INSERT INTO APP (ID, DT) VALUES ('1','22.12.2016') ?使用德语格式
    • @Mikhail_Sam 看docs.microsoft.com/en-us/sql/t-sql/functions/… - 你需要根据页面转换成104
    【解决方案3】:

    使用这个:

    CREATE TABLE APP(
        ID   INT NOT NULL,
        DT DATE ,
        ADDRESS  NVARCHAR (100) ,
        PRIMARY KEY (ID)
    );
    

    【讨论】:

      【解决方案4】:

      它的默认设置是 yyyy-MM-dd。

      不,不是。没有与该字段相关联的格式信息。

      该值未由数据库格式化。它仅作为一个时间点返回。将该值格式化为其文本表示由从数据库中获取数据的应用程序完成。

      因此,您无法在数据库中更改日期值的格式。您必须更改数据的显示位置。

      【讨论】:

      • 你在引用什么?例如。 “yyyy-MM-dd”不在此页面的任何位置(包括 cmets 和已删除的帖子(没有)。也没有在任何帖子修订中。)。
      【解决方案5】:

      日期以内部格式存储。 格式只对输入和输出有意义。

      您可以将格式化的日期作为单独的列包含:

      SQL Server 支持日期格式。您必须使用以下日期格式。


      与世纪 (yyyy) |标准 |输入/输出

       103              |    British/French |  103 = dd/mm/yyyy
      
      
      
      CREATE TABLE [dbo].[Post]
      (
          [Id]       INT IDENTITY (1, 1) NOT NULL,
          [Name]     VARCHAR(MAX) NULL,
          [RowNo]    INT  NULL,
          [ColNo]    INT  NULL,
          [Deadline] (CONVERT(VARCHAR(255), dt, 103)),  -- Include the formatted date as a separate column
      
          CONSTRAINT [PK_KtoCo]
              PRIMARY KEY CLUSTERED ([Id] ASC)
      );
      

      【讨论】:

        【解决方案6】:

        使用这个。

        创建表:

        CREATE TABLE EMP
        (EID NUMBER(20),
        ENAME VARCHAR2(20),
        DT DATE,
        SAL NUMBER(20));
        

        插入表格:

        INSERT INTO EMP (EID,ENAME,DT,SAL) VALUES(01,'ABCDE','11.NOV.2011',10000);
        

        上表的O/P:

        SELECT * FROM EMP;
        

        EID ENAME DT SAL

        01 ABCDE 11-DEC-11 10000

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          • 1970-01-01
          • 2016-03-29
          • 2014-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多