1. 程式人生 > >【原創】SQL 返回時間所在月份周次,該周起始結束日期

【原創】SQL 返回時間所在月份周次,該周起始結束日期

IF EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'fn_Week)
    DROP FUNCTION fn_Week
GO
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
/******************************************************************************
 * System Name : 
 * fn Name     : fn_Week
 * Summary     : 獲取當前時間所在月份的周次 
 * Parameter   :
 *              [Input]
 *               @pi_time datetime
 *
 * Remark      : Nothing
 *
 * History     : 2013/12/09 
 *
 *****************************************************************************/
CREATE function [dbo].[fn_Week](
@pi_time datetime, --傳入時間
@time_type nvarchar(3) --時間型別,w-返回週數,s-返回該周開始時間,e-返回該周結束時間
)
returns nvarchar(4000)   
as
begin
--1.0變數定義和初始化
declare @r nvarchar(20)--周次
declare @first_day datetime--該月第一天
declare @weekday int         --星期幾
declare @dayof_firstweek int--得到該月第一週有幾天
declare @dayof_time int
declare @remainder int--餘數


set @r = '' 
set @weekday = 0
set @dayof_firstweek = 0
set @dayof_time = 0
set @remainder  = 0


--2.0如果傳入時間的日期是所在月第一天,則肯定是第一週
if (day(@pi_time) = 1)
begin
--2.1周次
if(@time_type = 'w')
set @r='1'

--2.2開始時間
if(@time_type = 's')
set @r=cast((cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-01') as datetime) 


--2.3結束時間
if(@time_type = 'e')
set @r=cast((cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-07') as datetime) 
end


--3.0如果傳入時間的日期不是所在月第一天  
if (day(@pi_time) != 1)
begin
set @first_day=cast((cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-01') as datetime) 
select @weekday =case
when datename(weekday,@first_day)='Sunday'then 0--週日
when datename(weekday,@first_day)='Monday'then 1--周1
when datename(weekday,@first_day)='Tuesday'then 2--周2
when datename(weekday,@first_day)='Wednesday'then 3--周3
when datename(weekday,@first_day)='Thursday'then 4--周4
when datename(weekday,@first_day)='Friday'then 5--周5
when datename(weekday,@first_day)='Saturday'then 6--周6
  end
set @dayof_firstweek = 7 - @weekday--該月第一週有幾天

--3.1如果傳入時間在第一週範圍內,周次返回1
if(day(@pi_time) <= @dayof_firstweek)
begin
--3.1.1周次
if(@time_type = 'w')
begin
set @r='1'
end
--3.1.2開始時間
if(@time_type = 's')
begin 
set @r=cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-01' 
--set @r=convert(varchar(100),@r,23)
end


--3.1.3結束時間
if(@time_type = 'e')
begin 
set @r=cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-'+cast(@dayof_firstweek as nvarchar(2)) 
--set @r=convert(nvarchar(100),@r,23)
end
end

--3.2如果傳入時間不在第一週內
if(day(@pi_time) > @dayof_firstweek)
begin
set @dayof_time=day(@pi_time) + 7 - @dayof_firstweek
set @
[email protected]
_time%7 declare @week int--宣告臨時周次變數 set @week = 0 --3.2.1餘數大於0 if(@remainder > 0) begin set @week = 1 set @week = @dayof_time/7 + @week --周次 end --3.2.2餘數等於0 if(@remainder = 0) begin set @week = 0 set @week = @dayof_time/7 + @week --周次 end set @r= cast((@dayof_time/7 + cast(@r as int)) as nvarchar(20)) declare @start int--宣告該周起始時間天 set @start = 0 set @
[email protected]
_firstweek + 1 + 7*(@week - 2) --開始時間日期(天) declare @end int--宣告該周結束時間天 set @end = 0 set @[email protected]_firstweek + 7*(@week - 1) --結束時間日期(天) --3.2.3周次 if(@time_type = 'w') set @r=cast(@week as nvarchar(20)) --3.2.4開始時間 if(@time_type = 's') begin set @r=cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-'+cast(@start as nvarchar(2)) --set @r=convert(nvarchar(100),@r,23) end --3.2.5結束時間 if(@time_type = 'e') begin set @r=cast(year(@pi_time) as nvarchar(4))+'-'+cast(month(@pi_time) as nvarchar(2))+'-'+cast(@end as nvarchar(2)) --set @r=convert(nvarchar(100),@r,23) end end end return @r end


----呼叫(2013-12-09)

select dbo.fn_Week(getdate(),'w')
--2
select dbo.fn_Week(getdate(),'s')
--2013-12-8
select dbo.fn_Week(getdate(),'e')
--2013-12-14


相關推薦

原創SQL 返回時間所在月份起始結束日期

IF EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'fn_Week) DROP FUNCTION fn_Week GO set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO /*

原創VBA學習筆記(2)--例項VBA刪除表中的空行

Sub 巨集1迴圈內刪列() '資料不規範,有的空行是4,有的是6,有的是1就不好處理了     For i = 15 To 100 Step 2          Rows(i).Delete Shift:=xlUp &nb

原創新韭菜日記3---套牢的困局為什麼不願意止損割肉

為什麼不願意虧損了退出? -----一般聽起來,好像止損很高明,好像割肉就很傻?   前提情景:手上已經持股,並且已經浮虧了 行為模式:一直等待回升後,想著,我回本就賣! 實際上往往在下跌比較長一段時間/或幾次較大下跌後,出局      

原創php將form表單多請求的內容儲存到txt並顯示到form所在的頁面

小菜鳥分享小小經驗: 做之前百度理解相關函式(這個很重要),然後整合了一下自己的版本。 我做的是一個 同學聚會報名 頁面。 原始碼: <?php if(

原創用python將時間unix格式轉換總結

接受 bsp 時間戳 pretty 需要 字符串解析 time函數 spa datetime 我們可以用python裏面的time模塊mktime方法將轉為unix時間戳,mktime函數只能接受相應時間的元祖序列。在此之前需要先將輸入的時間轉為元組序列: 如果輸入的時間為

原創EXCEL公式經驗(7)---EXCLE一般都是返回單個值得如何寫公式返回多個匹配值?

  (1)一般excel都只能在一個單元格,且是輸入公式的這個單元格,返回一個值 (2)少數情況,可以在這個一單元格返回多個值 (3)現在考慮的是,輸入公式後,可以返回多個值    看起來公式還是遵循了(1)原則   INDEX($A:$A

原創Postman 如何處理上一個介面返回值作為下一個介面入參?

今天做介面測試,有一個介面的引數是一個校驗 token,會實時更新,開發提供了一個單獨返回實時 token 的介面,所以就需要在功能介面使用時呼叫 token 介面的返回值,作為功能介面的引數來使用。 網上搜了一下,都沒有現成的使用說明,剛才研究出來了,就記錄

原創建立與保持時間裕量詳細分析

  筆者這段時間在找工作中發現,關於時序分析的基礎概念,時序關係表示式及時序違例計算幾乎是每個IC/FPGA崗位筆試面試的必考內容。就此,從建立保持時間裕量出發,夯實基礎。本文主要是對之前轉載部落格【時序約束學習筆記1】Vivado入門與提高--第12講 時序分析中的基本概念和術語 做一些總結和個人理解。  

原創經驗分享(12)如何程式化kill提交到spark thrift上的sql

spark 2.1.1   hive正在執行中的sql可以很容易的中止,因為可以從console輸出中拿到當前在yarn上的application id,然後就可以kill任務, WARNING: Hive-on-MR is deprecated in Hive 2 and may no

原創經驗分享(15)spark sql limit實現原理

之前討論過hive中limit的實現,詳見 https://www.cnblogs.com/barneywill/p/10109217.html下面看spark sql中limit的實現,首先看執行計劃: spark-sql> explain select * from test1 limit

原創大資料基礎之Hive(1)Hive SQL執行過程

hive 2.1   hive執行sql有兩種方式: 執行hive命令,又細分為hive -e,hive -f,hive互動式; 執行beeline命令,beeline會連線遠端thrift server; 下面分別看這些場景下sql是怎樣被執行的: 1 hive命令 啟動

MyBatissql語句中的按時間排序無效問題order by create_time desc

mybatis的mapper檔案中書寫sql語句,但是根據時間倒序查詢的order by create_time 突然無效了,這是為什麼?導致無效的原因:時間格式做了改變,時間欄位別名和原始欄位重名,導

原創安裝ODAC後PL/SQL連線提…

問題描述:     安裝ODAC後,用PL/SQL登入測試原有的資料庫,先是提示:access violation ataddress....,重啟監聽後又     提示“TNS:無法解析指定的連線識別符號”錯誤。  原因分析:      因為同事也裝過一次,說是不能與oracle客戶端裝在同一個目錄下。但

原創面試時遇到『看門狗』脖子上掛著『時間輪』我就問你怕不怕?

Redisson的看門狗和Netty的時間輪,瞭解一下?寫的過程中順便打了一下自己的臉。技術嘛,不就是在不斷打臉的過程中成長起來的嘛。 荒腔走板聊生活 大家好,一週的時間過的飛快,轉眼間又到週末了。 老規矩,還是本號特色,先是荒腔走板的聊聊生活。 上面的圖片是我在一次跑步的過程中拍的,一隻狗子。可以看到圖

原創解BUG-xenomai核心與linux核心時間子系統之間存在漂移

版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有問題,歡迎指正。部落格地址:https://www.cnblogs.com/wsg1100/ ## 一、問題起源 >何為漂移?舉個例子兩顆32.768kHz晶振$C_1$和$C_2$,由於製造工藝原因或者使用時溫度、輔助元件引數等影響,與他們的實際

Sql Server 2008---安裝時卸載Visual Studio

studio ima ext 一段 image 控制面板 選擇 應用 技術 由於數據庫連接不上,所以卸載數據庫,然後安裝的時候出問題報錯,結果是因為vs, 所以就有了卸載vs這一步。某些圖片借用一下。 1. 打開電腦中的控制面板--程序和功能 2.找到要卸載的軟件,但

原創Python 對象創建過程中元類, __new__, __call__, __init__ 的處理

diff regular luci 自定義 weight ica 一般來說 att ray 原始type: type是最原始的元類,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple,

原創Beyond Compare 萬能破解方法

use cnblogs users sse bash 主程 官網 support compare 一、Mac 平臺上的破解 在官網(http://www.scootersoftware.com/download.php)下載最新的 Beyond Compare 解壓後,

原創datagridview動態綁定contextmenustrip並復制單元格數據

event args oar cells ren .get add cell ntc public class DGVCopy { public DataGridView DataGridViewCopy { get; set; }

原創一個支持極限大小的數組MaxArray且節省內存

類型 fin blog exc list 缺少 內存 stop con 大家好,我寫了一個支持極限大小的數組MaxArray,很有用的,希望大家喜歡~~ 問:.net類庫不是自帶了一個嗎,幹嘛還要自己寫一個?好在哪裏? 答:數組可以在創建後立即訪問範圍內的任意索