【问题标题】:Compare SQL date column with date比较 SQL 日期列和日期
【发布时间】:2021-08-06 07:26:00
【问题描述】:

假设我将日期列值插入为

 TO_DATE('06/08/2021', 'DD/MM/YYYY')

我想在 Golang 中将这个专栏 valid_till 比较为

_err := database.GetDbReadClient().Raw("SELECT * from base_configs  WHERE tenant = ? AND valid_till <= ?", tenant, time.Now()).Scan(&baseConfig).Error

time.Now() 不起作用。但我不知道如何去比较日期。

我在 Postgres 中的插入是否正确? 如果是这样,我可以写什么来代替时间。现在将其与valid_tillcolumn 进行比较?

【问题讨论】:

  • time.Now().Format("02/01/2006") ?
  • 这能回答你的问题吗? Golang parse strange date format
  • 这是time 包使用的参考日期。 pkg.go.dev/time#pkg-constants "布局中使用的参考时间是具体时间:Mon Jan 2 15:04:05 MST 2006,即Unix时间1136239445。由于MST是GMT-0700,所以参考时间可以认为是01/02 03 :04:05PM '06 -0700" 即选择特定时间是因为可以在其中识别出整齐的序列 1,2,3,4,5,6,7。跨度>
  • 如果您只是在查询中执行valid until now,您可以直接在查询中执行valid_till &lt;= now()

标签: postgresql go go-gorm


【解决方案1】:

您可以在原始 SQL 中将参数强制转换为 date 类型。

raw := `SELECT * FROM base_configs
WHERE tenant = ?
AND valid_till <= ?::date`

err := database.GetDbReadClient().Raw(raw, tenant, time.Now()).Scan(&baseConfig).Error

或者只是将time.Time 实例格式化为日期string

raw := `SELECT * FROM base_configs
WHERE tenant = ?
AND valid_till <= ?`

date := time.Now().Format("02/01/2006")
err := database.GetDbReadClient().Raw(raw, tenant, date).Scan(&baseConfig).Error

【讨论】:

  • 好的。 $2::date 有什么影响?由于存储的值已经是时间戳。没有?
  • $2::date 将作为$2 传入的任何值转换为date 类型。就像你做CAST($2 AS date)一样。见Type Casts
  • 当我使用美元语法运行查询时,它给了我一个错误。 expected 2 arguments, got 0; expected 2 arguments, got 0 [12.366ms] [rows:-] SELECT * FROM base_configs WHERE tenant = $1$ AND valid_till &lt;= $2$
  • @HalfWebDev 显示导致该错误的代码,显示您如何调用Raw 以及您传递给它的参数。但请不要在 cmets 中发布大代码 sn-ps,而是将代码发布在 play.golang.org 或其他一些 sn-p 共享站点上。
  • @HalfWebDev 好的,所以它似乎是一个特定于 gorm 的功能/错误。 Postgres 默认使用美元符号占位符,mysql 和 sqlite 方言使用问号占位符,我相信,gorm 似乎更喜欢这样。所以只需将美元符号改回问号,它应该可以工作。 github.com/go-gorm/gorm/issues/4307#issuecomment-844129524