如何在sql server中存储日期并进行比较?

时间:2015-06-20 11:25:18

标签: sql sql-server database date relationship

基本上,我需要为植物及其收获日期建立数据库。 例如,包含所有植物的表。

CREATE TABLE plant
    (
      plant_name NVARCHAR(20) NOT NULL
                              PRIMARY KEY ,
      best_to_harvest_day INT NOT NULL ,
      best_to_harvest_month NVARCHAR(15)
    )

植物入境示例:12月16日玫瑰 另一张叫做收获的桌子 多种收获的植物和收获时的日期在哪里。

CREATE TABLE harvests
(
    plant_name nvarchar(20) NOT NULL FOREIGN KEY REFERENCES plant(plant_name),
    amount int NOT NULL,
    havested_day int NOT NULL,
    harvested_month nvarchar(15),
    harvested year int NOT NULL
)

这种方法确实有效,因为我可以进行SQL查询来比较哪些植物在最佳时间收获等。 但是不是有一个整洁的方式? 像这样:(使用日期)

CREATE TABLE plant
(
  plant_name NVARCHAR(20) NOT NULL
                          PRIMARY KEY ,
  best_to_harvest DATE --But here should only be day and month, not year.
)

CREATE TABLE harvests
(
  plant_name NVARCHAR(20) NOT NULL
                          FOREIGN KEY REFERENCES plant ( plant_name ) ,
  amount INT NOT NULL ,
  harvested DATE --But here i need full date year,day,month
)

底线是我需要比较它们。 好的,我想我可以使用EXTRACT(单位来自日期) 然后比较它们,但问题仍然存在,如何使工厂表日期不包括年份?

1 个答案:

答案 0 :(得分:0)

首先,将日期部分存储为数字并检查其值。这不是完美的,但可能还不错:

CREATE TABLE plant (
    plant_id int not null PRIMARY KEY,
    plant_name nvarchar(20) NOT NULL UNIQUE,
    best_to_harvest_day int NOT NULL,
    best_to_harvest_month int not NULL,
    check (best_to_harvest_day between 1 and 31),
    check (best_to_harvest_month between 1 and 12)
);

请注意包含整数标识主键。建议这样做,因为整数对于外键引用更有效。

然后使用date收获:

CREATE TABLE harvests (
    harvest_id int not null primary key,
    plant_id int NOT NULL FOREIGN KEY REFERENCES plant(plant_id),
    amount int NOT NULL,
    harvested date --But here i need full date year,day,month
);

你可以这样做:

select h.*,
       (case when p.best_to_harvest_day = day(h.harvest_day) and
                  p.best_to_harvest_month = month(h.harvest_month)
             then 'Y' else 'N'
        end)
from harvest h join
     plant p
     on h.plant_id = p.plant_id;