簡體   English   中英

SQL Server:日期操作的最佳實踐查詢

[英]SQL Server : best practice query for date manipulation

長期聆聽者,第一次來電者。

在工作中,我們將大多數表的所有日期列存儲為簡單的“字符串”( varchar ) 格式。 yyyymmdd (如 20220625)或 yyyymm(202206)等。

現在對於許多基於時間的查詢,我們需要與當前日期或當前日期的某個固定偏移量進行比較。

現在,我知道將當前 utc 日期轉換為其中任何一種格式的兩個明顯版本如下(以 yyyymm 為例):

  1. SELECT LEFT(CONVERT(VARCHAR, GETUTCDATE(), 112), 6) ...
  2. SELECT CONVERT(VARCHAR(6), GETUTCDATE(), 112) ...

我想知道是否有人知道更好的方法,無論是慣用的還是性能方面的轉換,和/或第二個與第一個在安全性/可靠性等方面有什么問題需要擔心嗎? 第二個絕對滿足我的代碼高爾夫敏感性,但如果它是以我不知道的東西為代價的話。

此外,對於一些額外的上下文,我們的大部分代碼都在 SQL Server 或 T-SQL 中運行,但我們還需要盡可能地與平台無關,因為 Oracle 和/或 Mysql 上有客戶。

任何見解/幫助將不勝感激。

兩種方法都沒有問題。 兩者都工作得很好。 選擇哪個是個人喜好問題。 第一個看起來更明確,第二個更短,因此可能更容易閱讀。 至於性能:您只想在查詢中獲取當前日期或月份一次,因此調用不會真正影響查詢運行時。

至於讓這個平台不可知論是完全不同的故事。 SQL 方言不同。 特別是在日期/時間處理方面。 您已經注意到 SQL Server 的日期函數非常有限。 在 Oracle 和 MySQL 中,您可以簡單地聲明您想要的格式(Oracle 中TO_CHAR(SYSDATE, 'YYYYMM')和 MySQL 中DATE_FORMAT(CURRENT_DATE, '%Y%m') )。 但是您也會看到函數調用有所不同。

現在,您可以為此編寫一個用戶定義的函數 GET_CURRENT_MONTH_FORMATTED,它將返回當前月份的字符串,例如“202206”。 然后,您將在該函數中隱藏不同的代碼,並且 SQL 查詢看起來都一樣。 但是,問題是如何告訴 DBMS 函數結果對於特定時間戳是確定性的? 如果您在 2022 年 12 月 31 日 23:50 運行查詢,並且它一直運行到 2023 年 1 月 1 日 0:20,您希望 DBMS 只為導致“202212”的查詢調用此函數一次並且不再被調用,突然導致另一個字符串'202301'。 我什至不知道這是否可能。 我想不是。

我認為您無法編寫一個查詢,該查詢可以執行您想要的操作並且在所有提到的 DBMS 中看起來都一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM