Sql 在的列中插入当前日期时间,并保持不变
我正在使用SQLServer使用javafx制作我的项目。我有一张买卖表。这两个字段的其中一列都是date,它具有当前日期和时间,用于将它们存储为记录,表明此事务已在此时保存。 现在,我将该日期列与varchar数据类型一起使用,并将计算列规范与以下函数一起使用:Sql 在的列中插入当前日期时间,并保持不变,sql,sql-server,nested-queries,Sql,Sql Server,Nested Queries,我正在使用SQLServer使用javafx制作我的项目。我有一张买卖表。这两个字段的其中一列都是date,它具有当前日期和时间,用于将它们存储为记录,表明此事务已在此时保存。 现在,我将该日期列与varchar数据类型一起使用,并将计算列规范与以下函数一起使用: (CONVERT([varchar](25),getdate(),(120))) 但当我使用查询从该表中选择记录时 SELECT pr.Date, p.Name, pr.Quantity, s.Name, p.Pur_Price F
(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))
但它选择所有记录,将所有日期记录保留为当前日期和时间。提前谢谢。
期待您的回复。问题在于您的
日期列是动态计算的,而不是实际存储在表中。因此,每次从该表中选择,都会计算计算列的表达式(CONVERT([varchar](25),getdate(),(120))
,从而为所有行生成相同的值
修复方法是使用持久化的
计算列,以便在插入或更新时实际存储表中的值:
CREATE TABLE Product (
OtherColumns INT,
[Date] AS (CONVERT([varchar](25), getdate(), 120)) PERSISTED)
问题在于,非确定性表达式无法持久化,因为会弹出以下错误消息:
Msg 4936,16级,状态1,表中第1行计算列“日期”
“产品”无法持久化,因为该列不确定
您还有其他几种选择。请使用DATE
或DATETIME
列来存储和处理日期,并避免使用VARCHAR
,因为这会带来很多问题。以下示例使用了DATETIME
:
- 使用链接到具有所需表达式的列的
默认约束:
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
- 使用触发器设置值。这将覆盖原始操作设置的任何插入或更新的值(因为它将在操作后执行,如定义中所述)
谢谢大家。但我解决了这个问题,将该表的date列放入datetime数据类型,然后在查询中使用getdate()方法输入日期。在我的购买和销售表中保存当前日期和时间对我来说很有效。此查询的目的是什么?请向我们显示您对相关表的DDL。以及DML如何在该表中插入行
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