【问题标题】:SQL server 2012 tables issue, sysdate and to_date issueSQL server 2012 表问题、sysdate 和 to_date 问题
【发布时间】:2013-06-16 07:50:11
【问题描述】:

我在尝试创建表格时遇到了两个问题。

对于 **sysdate*** 它说无效的列名 对于 *TO_DATE('01-JAN-2008','DD-MON-YYYY')));* 它说 TO_DATE 不是重新识别的内置函数名称.

^ 两者都在表格发票中。

这是使用 SQL SERVER 2012

CREATE TABLE VENDOR(
V_CODE          INTEGER     NOT NULL    UNIQUE,
V_NAME          VARCHAR(35) NOT NULL,
V_CONTACT       VARCHAR(15) NOT NULL,
V_AREACODE      CHAR(3)     NOT NULL,
V_PHONE         CHAR(8)     NOT NULL,
V_STATE         CHAR(2)     NOT NULL,
v_ORDER         CHAR(1)     NOT NULL,
PRIMARY KEY (V_CODE));

CREATE TABLE PRODUCT(
P_CODE          VARCHAR(10)     NOT NULL,
P_DESCRIPT      VARCHAR(35)     NOT NULL,
P_INDATE        DATE            NOT NULL,
P_QOH           SMALLINT        NOT NULL,
P_MIN           SMALLINT        NOT NULL,
P_PRICE         DECIMAL(8,2)    NOT NULL,
P_DISCOUNT      DECIMAL(5,2)    NOT NULL,
V_CODE          INTEGER,
PRIMARY KEY (P_CODE),
FOREIGN KEY(V_CODE) REFERENCES VENDOR ON UPDATE CASCADE);


CREATE TABLE CUSTOMER(
CUS_CODE            DECIMAL         PRIMARY KEY,
CUS_LNAME           VARCHAR(15)     NOT NULL,
CUS_FNAME           VARCHAR(15)     NOT NULL,
CUS_INITIAL         CHAR(1),            
CUS_AREACODE        CHAR(3)         DEFAULT '615'       NOT NULL,
                                                        CHECK(CUS_AREACODE IN ('615','713','931')),
CUS_PHONE           CHAR(8)         NOT NULL,
CUS_BALANCE         DECIMAL(9,2)        DEFAULT 0.00,
CONSTRAINT CUS_UI1 UNIQUE (CUS_LNAME, CUS_FNAME));


CREATE TABLE INVOICE (
INV_NUMBER      DECIMAL     PRIMARY KEY,
CUS_CODE        DECIMAL     NOT NULL REFERENCES CUSTOMER(CUS_CODE),
INV_DATE        DATE        DEFAULT SYSDATE NOT NULL,
CONSTRAINT INV_CK1 CHECK (INV_DATE > TO_DATE('01-JAN-2008','DD-MON-YYYY')));

【问题讨论】:

    标签: sql sql-server web-applications


    【解决方案1】:

    你有两个问题:

    • 获取当前系统日期和时间的函数在T-SQL/SQL Server中调用SYSDATETIME()(不是sysdate

    • 在 T-SQL/SQL Server 中将字符串转换为datedatetime 的方法是使用CASTCONVERT(不是TO_DATE - T 中没有这样的功能-SQL)

    使用类似的东西

    SELECT CAST('01-JAN-2008' AS DATE) 
    

    或类似的东西(它在很大程度上取决于您在 SQL Server 中的语言/日期格式设置是否有效)。如果您需要指定特定格式,可以使用CONVERT,它允许您使用多种预定义格式之一(请参阅relevant details in the MSDN documentation)。

    如果这还不够 - SQL Server 2012 有一个名为 PARSE 的新函数,它允许您指定字符串格式化的任意日期格式。再次,请参阅 relevant MSDN documentation for details .

    最好的办法是尽可能避免在字符串之间来回转换日期,在您的情况下,这应该很容易做到!只需使用:

    INV_DATE DATE DEFAULT SYSDATETIME() NOT NULL,
    
    CONSTRAINT INV_CK1 CHECK (INV_DATE > '20080101');
    

    【讨论】:

    • 感谢您详尽而精彩的解释。我现在知道 SYSDATETIME() 是正确的用法。我意识到我可能需要检查 SQL Server 中的格式设置。我不知道这是必需的。我将代码更改为 CONSTRAINT INV_CK1 CHECK (INV_DATE > '20080101');而且效果很好。
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多