Skip to content

Commit 1ff6363

Browse files
correct sign of difftime for various DBMS' (#1532)
--------- Co-authored-by: Simon P. Couch <[email protected]>
1 parent c3aa406 commit 1ff6363

9 files changed

+15
-12
lines changed

NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# dbplyr (development version)
22

3+
* Translations of `difftime()` for Postgres, SQL server, Redshift, and Snowflake
4+
previously returned the wrong sign and are now correct (@edward-burn, #1532).
5+
36
* `across(everything())` doesn't select grouping columns created via `.by` in
47
`summarise()` (@mgirlich, #1493).
58

R/backend-mssql.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ simulate_mssql <- function(version = "15.0") {
383383
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
384384
}
385385

386-
sql_expr(DATEDIFF(DAY, !!time1, !!time2))
386+
sql_expr(DATEDIFF(DAY, !!time2, !!time1))
387387
}
388388
)
389389

R/backend-postgres.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ sql_translation.PqConnection <- function(con) {
268268
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
269269
}
270270

271-
sql_expr((CAST(!!time2 %AS% DATE) - CAST(!!time1 %AS% DATE)))
271+
sql_expr((CAST(!!time1 %AS% DATE) - CAST(!!time2 %AS% DATE)))
272272
},
273273
),
274274
sql_translator(.parent = base_agg,

R/backend-redshift.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ sql_translation.RedshiftConnection <- function(con) {
9494
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
9595
}
9696

97-
sql_expr(DATEDIFF(DAY, !!time1, !!time2))
97+
sql_expr(DATEDIFF(DAY, !!time2, !!time1))
9898
}
9999
),
100100
sql_translator(.parent = postgres$aggregate,

R/backend-snowflake.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ sql_translation.Snowflake <- function(con) {
243243
cli::cli_abort('The only supported value for {.arg units} on SQL backends is "days"')
244244
}
245245

246-
sql_expr(DATEDIFF(DAY, !!time1, !!time2))
246+
sql_expr(DATEDIFF(DAY, !!time2, !!time1))
247247
},
248248
# LEAST / GREATEST on Snowflake will not respect na.rm = TRUE by default (similar to Oracle/Access)
249249
# https://docs.snowflake.com/en/sql-reference/functions/least

tests/testthat/test-backend-mssql.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ test_that("custom clock functions translated correctly", {
143143

144144
test_that("difftime is translated correctly", {
145145
local_con(simulate_mssql())
146-
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
147-
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
146+
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
147+
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
148148

149149
expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
150150
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))

tests/testthat/test-backend-postgres.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ test_that("custom clock functions translated correctly", {
102102

103103
test_that("difftime is translated correctly", {
104104
local_con(simulate_postgres())
105-
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("(CAST(`end_date` AS DATE) - CAST(`start_date` AS DATE))"))
106-
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("(CAST(`end_date` AS DATE) - CAST(`start_date` AS DATE))"))
105+
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("(CAST(`start_date` AS DATE) - CAST(`end_date` AS DATE))"))
106+
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("(CAST(`start_date` AS DATE) - CAST(`end_date` AS DATE))"))
107107

108108
expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
109109
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))

tests/testthat/test-backend-redshift.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ test_that("custom clock functions translated correctly", {
7272

7373
test_that("difftime is translated correctly", {
7474
local_con(simulate_redshift())
75-
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
76-
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
75+
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
76+
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
7777

7878
expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
7979
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))

tests/testthat/test-backend-snowflake.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ test_that("custom clock functions translated correctly", {
116116

117117
test_that("difftime is translated correctly", {
118118
local_con(simulate_snowflake())
119-
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
120-
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `start_date`, `end_date`)"))
119+
expect_equal(test_translate_sql(difftime(start_date, end_date, units = "days")), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
120+
expect_equal(test_translate_sql(difftime(start_date, end_date)), sql("DATEDIFF(DAY, `end_date`, `start_date`)"))
121121

122122
expect_error(test_translate_sql(difftime(start_date, end_date, units = "auto")))
123123
expect_error(test_translate_sql(difftime(start_date, end_date, tz = "UTC", units = "days")))

0 commit comments

Comments
 (0)