我在使用javafx创建项目时使用sql server。他们我有一张买卖表。这两个列中的一列是具有当前日期和时间的日期,以将它们存储为该事务在该时间已被保存的记录。 现在我正在使用具有varchar数据类型的那一日期列,并使用具有以下功能的计算列指定:
(CONVERT([varchar](25),getdate(),(120)))
但是当我使用查询从该表中选择记录时
SELECT pr.Date, p.Name, pr.Quantity, s.Name, p.Pur_Price
FROM (([Product] AS p
INNER JOIN [Purchase] AS pr ON pr.Product_id=p.Product_id)
INNER JOIN [Supplier] AS s ON s.Supplier_Id=p.Supplier_Id)
WHERE pr.Date>= dateadd(dd, 0, datediff(dd, 0, getdate()-30))
,但是它选择所有记录,使所有日期记录保持当前日期和时间。提前致谢。 期待您的良好答复。
答案 0 :(得分:0)
问题是您的Date
列是动态计算的,而不是实际存储在表中的。因此,每次您从该表中SELECT
时,都会计算(CONVERT([varchar](25),getdate(),(120)))
的计算列的表达式,因此所有行的值都相同。
一种修复方法是使用PERSISTED
计算列,以便在插入或更新时将值与表一起实际存储:
CREATE TABLE Product (
OtherColumns INT,
[Date] AS (CONVERT([varchar](25), getdate(), 120)) PERSISTED)
与此有关的问题是,不确定性表达式不能持久化,因为会弹出此错误消息:
信息4936,级别16,状态1,第1行,表中的“日期”计算列 因为该列是不确定的,所以无法保留“产品”。
您还有其他选择。请使用DATE
或DATETIME
列存储和处理日期,并避免使用VARCHAR
,因为这样做会带来很多问题。以下示例使用DATETIME
:
使用DEFAULT
约束链接到具有所需表达式的列:
CREATE TABLE Product (
OtherColumns INT,
[Date] DATETIME DEFAULT GETDATE())
INSERT INTO Product (
OtherColumns) -- Skip the Date column on the INSERT
VALUES
(1)
SELECT * FROM Product
OtherColumns Date
1 2018-12-14 08:49:08.347
INSERT INTO Product (
OtherColumns,
Date)
VALUES
(2,
DEFAULT) -- Or use the keyword DEFAULT to use the default value
SELECT * FROM Product
OtherColumns Date
1 2018-12-14 08:49:08.347
2 2018-12-14 08:50:10.070
使用触发器设置值。这将覆盖原始操作设置的任何插入或更新的值(因为它将在操作中 执行,如其定义中所述)。
CREATE TRIGGER utrProductSetDate ON Product
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
UPDATE P SET
Date = GETDATE()
FROM
inserted AS I
INNER JOIN Product AS P ON I.OtherColumns = P.OtherColumns -- Assuming PK or Unique columns join
END
答案 1 :(得分:0)
谢谢大家。但是我通过将表的date列放入datetime数据类型来解决了我的问题,而我的查询已经使用getdate()方法输入了日期。它对我有用,可以将当前日期和时间保存在我的买卖表中。